C语言结构体中动态数组的访问与修改问题求助
C语言动态内存结构体数组修改问题解决
核心问题分析与修正
你的代码存在两个关键错误,还有一个潜在的内存风险:
语法错误
你写的book_A->array[3]->date是错误的。book_A->array是DataState*类型,array[3]是数组的第4个元素(C语言数组下标从0开始),它是一个DataState结构体实例而非指针,访问成员必须用.操作符,正确写法是:book_A->array[3].date = auxiliary;野指针风险
auxiliary指向的是局部变量a的地址,makeBook函数执行完毕后,局部变量a会被销毁,该地址将变为无效内存,后续访问date会触发未定义行为。解决办法是动态分配内存存储数据:int* auxiliary = malloc(sizeof(int)); *auxiliary = 5; book_A->array[3].date = auxiliary;数组越界检查
如果调用makeBook时传入的number小于等于3,array[3]会发生越界访问,这是非常危险的。建议在函数开头添加判断:if (number <= 3) { printf("错误:number必须大于3\n"); return NULL; }
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { char string[64]; void* date; void* colour; } DataState; typedef struct { int number; DataState* array; } Book; Book* makeBook (int number){ // 检查number是否足够,避免越界 if (number <= 3) { printf("错误:number必须大于3\n"); return NULL; } // 分配Book结构体内存,检查是否成功 Book* book_A = malloc(sizeof(Book)); if (!book_A) { perror("分配Book内存失败"); return NULL; } book_A->number = number; // 分配DataState数组内存,检查是否成功 book_A->array = malloc(number * sizeof(DataState)); if (!book_A->array) { perror("分配DataState数组内存失败"); free(book_A); // 释放已分配的Book内存 return NULL; } // 动态分配内存存储整数5,避免野指针 int* auxiliary = malloc(sizeof(int)); if (!auxiliary) { perror("分配auxiliary内存失败"); free(book_A->array); free(book_A); return NULL; } *auxiliary = 5; // 正确修改数组元素的成员 book_A->array[3].date = auxiliary; return book_A; } // 记得写释放内存的函数,防止内存泄漏 void freeBook(Book* book) { if (!book) return; // 释放每个DataState里动态分配的date和colour for (int i = 0; i < book->number; i++) { free(book->array[i].date); free(book->array[i].colour); } free(book->array); free(book); }
内容的提问来源于stack exchange,提问作者Juan598
相关产品推荐
相关产品推荐

