c - 结构体中指针的大小

标签 c multithreading queue pthreads circular-buffer

所以,我用这个结构来实现另一个结构(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(structplane) * size);。 问题是缓冲区的大小始终为 8 字节,正如它所说的那样,size 乘以 plane 的大小,实际上是 16。 问题是我应该如何初始化变量,以便获得我想要的缓冲区大小。由于限制,我无法更改函数的返回值或参数。 预先谢谢您!

最佳答案

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

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

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

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

关于c - 结构体中指针的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50138604/

相关文章:

c - 以递减顺序在链表中插入节点 - C

C++线程应用程序运行速度比非线程慢

java - 使用 ScheduledThreadPoolExecutor 暂停计划任务

c# - 为什么服务器不使用 C# 中的套接字在本地传输中接收所有 UDP 数据包?

java - 如何使用流在不阻塞的情况下处理队列的所有元素?

jQuery every : loop an array, 通过 jQuery 附加文本并执行动画

java - 堆栈,foreach,错误的顺序?

c - 为什么 sizeof(x++) 不增加 x?

c - 如何向进程发送信号以调用 exit() 并终止

c - 简单流程图