#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]);
Хотя будет более последовательно использовать перегруженный оператор <