【问题标题】:Size of pointer inside a struct结构内指针的大小
【发布时间】:2018-05-02 15:45:04
【问题描述】:

所以,我有这个结构用来实现另一个结构的循环缓冲区 (plane)

typedef struct queue
{
    struct plane *q;        
    int size, capacity, front, rear;  
}queue;

在此之后我声明结构

queue *q;

后来,为了初始化缓冲区,我使用这种方法

int queue_init(int size){

    q = (queue*) malloc(sizeof(queue));

    q->q=malloc(sizeof(struct plane) * size); 

    q->size = 0;
    q->capacity = size;
    q->front = 0;
    q->rear = 0;

    return 0;
}

它应该是初始化所有变量的变量,我需要使用缓冲区和缓冲区本身与q->q=malloc(sizeof(struct plane) * size);。 问题是缓冲区的大小总是 8 字节,正如它所说的那样,size 乘以 plane 的大小,实际上是 16。 问题是我应该如何初始化变量,以便获得所需大小的缓冲区。我不能更改函数的返回值或参数作为限制。 预先感谢您!

【问题讨论】:

  • “他的问题是缓冲区的大小总是8字节”你怎么知道?这对我来说看起来不错。好吧,除了函数从不返回 malloc 的指针而是使用全局变量...
  • 请不要在 cmets 中进行澄清,而是 edit 您的问题并将它们放在 那里
  • 当你说你声明事物时,你实际上是在声明事物的指针。我怀疑你看到的是指针的大小,而不是指向的东西的大小。你可以写sizeof *q来获取q指向的默认对象的大小。
  • 正确命名总是一个好主意。例如。 struct plane *q; 应该命名为 struct plane *planequeue; 。这将避免像q->q 这样的恐怖。

标签: c multithreading queue pthreads circular-buffer


【解决方案1】:

如果您试图通过 sizeof(q->q) 获取数组的大小,这将无法按预期工作。

由于struct queueq 字段是指针而不是数组,sizeof(q->q) 实际上为您提供了指针的大小,在您的机器上看起来是 8 字节大小。

该语言不会跟踪在调用malloc 时分配了多少内存,因此您需要自己跟踪。好消息是您已经在这样做了。

您使用malloc(sizeof(struct plane) * size) 为大小为sizestruct place 数组正确分配了空间,并将size 存储在q->capacity 中。这样你就知道数组有多大了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-08
    • 2017-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多