Как инициализировать динамический массив из структуры C

#c #struct #compiler-errors #initialization #function-definition

Вопрос:

У меня есть задание написать функцию, которая динамически инициализирует массив из структуры, находящейся в заголовочном файле. и по какой-то причине я продолжаю получать ту же ошибку «неинициализированная локальная переменная ‘columnData’ используется в заголовочном файле

 #ifndef QUEUE_H
#define QUEUE_H


/* a queue contains positive integer values. */
typedef struct queue
{
    int arraySize;
    int* column;
} queue;

void initQueue(queue* q, unsigned int size);
void cleanQueue(queue* q);

void enqueue(queue* q, unsigned int newValue);
int dequeue(queue* q); // return element in top of queue, or -1 if empty

#endif /* QUEUE_H */
 

это мой код:

 #include <iostream>
#include "queue.h"

int main()
{
    queue* columnData;
    unsigned int size = 0;
    std::cout << "Please enter column size: ";
    std::cin >> size;
    initQueue(columnData, size);
    printf("%d", amp;columnData->column[0]);

}

void initQueue(queue* q, unsigned int size) {
    q->column = new int[size];
    q->column[0] = 5;
}

void cleanQueue(queue* q) {

}

void enqueue(queue* q, unsigned int newValue) {

}

int dequeue(queue* q) {
    return 1;
}
 

Если кто-нибудь сможет мне помочь, это будет здорово.

Комментарии:

1. Вы никогда не присваиваете columnData значение main , а затем считываете это неинициализированное значение для передачи функции. Возможно, вы захотите иметь queue columnData и передать его amp;columnData своим функциям. Лучше было бы взять на себя все эти функции и сделать их членами queue .

Ответ №1:

Вы объявили неинициализированный указатель

 queue* columnData;
 

это имеет неопределенное значение. Поэтому вызов функции initQueue

 initQueue(columnData, size);
 

вызывает неопределенное поведение, поскольку в функции этот указатель разыменован.

 q->column = new int[size];
q->column[0] = 5;
 

Также функция не устанавливает элемент данных arraySize .

Вам нужно в main объявить объект типа queue

 queue columnData;
 

и вызовите функцию, например

 initQueue( amp;columnData, size);
 

и в функции вы также должны установить элемент данных arraySize , такой как

 columnData->arraySize = size;
 

Обратите внимание, что этот звонок

 printf("%d", amp;columnData->column[0]);
 

это тоже неправильно. Вы пытаетесь вывести указатель, используя неверный спецификатор преобразования %d .

После изменения объявления объекта columnData , показанного выше, вызов printf будет выглядеть следующим образом

 printf("%d", columnData.column[0]);
 

Хотя будет более последовательно использовать перегруженный оператор <