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

C语言中数组最后列赋值时下一行首元素同步更新问题排查

问题分析与解决

核心问题1:数组越界访问

你定义的col=4,意味着数组的有效下标范围是0~3,但代码里却访问了arr[0][4]和table[0][4],这属于越界访问,会破坏相邻内存区域的数据——这就是table[0][4]和table[1][0]值互相影响的直接原因,它们在内存中是相邻的非法访问区域。

核心问题2:内存分配大小错误

给table[i]分配内存时,你写的是:

table[i] = malloc(sizeof(table) * col);

table是PQ**类型的指针,sizeof(table)得到的是指针的字节数(比如64位系统是8字节),但你需要分配的是col个PQ结构体的空间,正确写法应该是:

table[i] = malloc(sizeof(PQ) * col);
// 更健壮的写法:用 sizeof(*table[i]),避免结构体类型变更时出错
// table[i] = malloc(sizeof(*table[i]) * col);

错误的分配大小会导致内存空间不足,后续赋值操作会覆盖其他行的内存,引发数据混乱。

修复后的代码片段

typedef struct _PQ {
    short cost;
} PQ;

void Dijkstra(short** arr, short row, short col) {
    PQ **table;
    table = malloc(sizeof(*table) * row);
    for (int i = 0; i < row; i++) {
        // 修正内存分配的大小计算
        table[i] = malloc(sizeof(PQ) * col);
    }

    // 遍历范围修正为合法的0~col-1
    for (short i = 0; i < row; i++) {
        for (short j = 0; j < col; j++) {
            table[i][j].cost = arr[i][j];
        }
        if (i == 0) {
            // 若要访问arr第5个元素,需确认col实际为5,否则移除该越界访问
            // printf("First run: %hd %hd\n", arr[0][4], table[0][4].cost);
            printf("%hd ", table[1][0].cost);
        }
    }

    // 记得释放内存,避免泄漏
    for (int i = 0; i < row; i++) {
        free(table[i]);
    }
    free(table);
}

额外提示

  • 始终确保数组访问的下标在0~length-1范围内,越界访问是C语言常见Bug根源,会引发不可预测的内存错误。
  • 内存分配后建议检查malloc返回值是否为NULL,避免空指针访问。
  • 使用sizeof(*指针变量)计算内存大小更健壮,变量类型变更时无需手动修改sizeof参数。

内容的提问来源于stack exchange,提问作者parky1233

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:15:39