Размер указателя внутри структуры - PullRequest
0 голосов
/ 02 мая 2018

Итак, у меня есть эта структура, используемая для реализации циклического буфера другой структуры (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. Дело в том, как я должен инициализировать переменные, чтобы я мог получить буфер нужного размера. Я не могу изменить возвращаемое значение или параметры функции как ограничения. Спасибо заранее!

1 Ответ

0 голосов
/ 02 мая 2018

Если вы пытаетесь получить размер массива с помощью sizeof(q->q), это не будет работать так, как вы ожидаете.

Поскольку q поле struct queue является указателем, а не массивом, sizeof(q->q) фактически дает вам размер указателя, который на вашем компьютере имеет размер 8 байт.

Язык не отслеживает, сколько памяти было выделено при вызове malloc, поэтому вам нужно следить за этим самостоятельно. Хорошо, что вы уже делаете это.

Вы правильно выделили пространство для массива struct place размера size, используя malloc(sizeof(struct plane) * size), и вы сохранили size в q->capacity. Итак, вы знаете, насколько большой массив.

...