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
相关产品推荐
相关产品推荐

