C++如何基于struct结构体动态初始化数组,解决未初始化变量报错
问题根因
- 你声明的
queue* columnData是未初始化的野指针,没有指向任何合法的queue结构体内存空间,直接传入initQueue对指针解址操作就会触发「uninitialized local variable 'columnData' used」报错。 - 现有
initQueue实现未给结构体的arraySize成员赋值,不符合队列结构设计要求,后续队列判空、越界校验都会缺少依据。 - 你代码中
printf("%d", &columnData->column[0]);的写法是打印数组首元素的地址,而非元素值,要打印值需要去掉取址符&。
修复代码
你可以选择栈上分配结构体或者堆上分配两种方案,以下是完整可运行的修改版本:
#include <iostream> #include "queue.h" int main() { // 方案1:栈上分配结构体,直接取地址传入即可,不需要额外释放结构体 queue columnData; unsigned int size = 0; std::cout << "Please enter column size: "; std::cin >> size; initQueue(&columnData, size); // 打印第一个元素的值,去掉& printf("%d", columnData.column[0]); // 用完记得清理动态分配的数组 cleanQueue(&columnData); return 0; /* 方案2:堆上分配结构体,需要手动释放结构体本身 queue* columnData = new queue; unsigned int size = 0; std::cout << "Please enter column size: "; std::cin >> size; initQueue(columnData, size); printf("%d", columnData->column[0]); cleanQueue(columnData); delete columnData; return 0; */ } void initQueue(queue* q, unsigned int size) { // 补充给arraySize赋值 q->arraySize = size; q->column = new int[size]; q->column[0] = 5; } void cleanQueue(queue* q) { // 补充释放动态数组的逻辑 delete[] q->column; q->column = nullptr; q->arraySize = 0; } void enqueue(queue* q, unsigned int newValue) { // 后续自行实现入队逻辑 } int dequeue(queue* q) { // 后续自行实现出队逻辑 return 1; }
额外注意事项
- 后续实现入队出队逻辑时,需要额外添加头/尾下标成员记录队列的读写位置,否则无法完成先进先出的队列特性。
- 所有
new申请的内存都要对应delete释放,避免内存泄漏,动态数组要使用delete[]释放。
内容的提问来源于stack exchange,提问作者roee attias
相关产品推荐
相关产品推荐

