结构体数组嵌套指针的realloc调用崩溃问题求助
崩溃原因分析与修复方案
核心崩溃原因
未初始化的
node指针触发非法内存访问
第一次调用czytaj时,realloc扩容结构体数组后,新分配的przejscie_t结构体中node成员是未初始化的垃圾值,并非NULL。而realloc要求第一个参数必须是NULL(等价于malloc)或之前malloc/realloc返回的有效指针,传入垃圾值会导致realloc尝试访问非法内存,直接引发崩溃。数组越界写入
你为node分配了l*sizeof(int)的空间,数组有效索引范围是0到l-1,但代码中使用(*graf)[vp].node[(*graf)[vp].l] = vk,用l作为索引写入,超出了数组边界,会覆盖非法内存区域,触发崩溃或未定义行为。未处理
realloc失败场景
若realloc因内存不足返回NULL,直接赋值会丢失原有指针造成内存泄漏,后续访问NULL指针也会引发崩溃。
修正后的代码
#include <stdlib.h> typedef struct { int *node; int l; } przejscie_t; void czytaj(przejscie_t **graf, int vp, int vk) { // 先保存realloc结果,避免分配失败丢失原内存 przejscie_t *temp_graf = realloc(*graf, (vp + 1) * sizeof(przejscie_t)); if (temp_graf == NULL) { // 可添加自定义错误处理逻辑,比如日志输出 return; } *graf = temp_graf; przejscie_t *current = &(*graf)[vp]; // 首次初始化时确保状态正确 if (current->node == NULL) { current->l = 0; } // 先扩容长度,再分配对应内存 current->l++; int *temp_node = realloc(current->node, current->l * sizeof(int)); if (temp_node == NULL) { // 分配失败回滚长度,保证状态一致 current->l--; return; } current->node = temp_node; // 使用合法索引写入数据 current->node[current->l - 1] = vk; }
修正说明
- 用临时指针接收
realloc返回值,避免分配失败丢失原有内存 - 首次初始化时显式处理
node为NULL的情况,保证realloc调用合法 - 调整逻辑:先递增长度再分配内存,使用
l-1作为有效索引写入数据 - 添加
realloc失败的错误处理,避免程序进入非法状态
内容的提问来源于stack exchange,提问作者Michał Jagodzinski
相关产品推荐
相关产品推荐

