You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结构体数组嵌套指针的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;
}

修正说明

  1. 用临时指针接收realloc返回值,避免分配失败丢失原有内存
  2. 首次初始化时显式处理node为NULL的情况,保证realloc调用合法
  3. 调整逻辑:先递增长度再分配内存,使用l-1作为有效索引写入数据
  4. 添加realloc失败的错误处理,避免程序进入非法状态

内容的提问来源于stack exchange,提问作者Michał Jagodzinski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 17:50:33