C语言动态矩形矩阵遍历崩溃排查:行数小于列数时内存访问错误
动态内存矩阵访问崩溃问题排查与修复
问题概述
使用C语言指针在动态内存创建矩阵,填充随机数并打印时,当行数小于列数程序崩溃,返回错误码0xC0000005(内存访问冲突)。调试发现当i=0、j=2时,**(matrix + 2)无法访问内存,但方形矩阵或行数大于列数时运行正常。
原问题代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> int main() { int rows = 2; int cols = 3; int **matrix = malloc(sizeof(int*) * rows); // 为矩阵指针数组分配内存 for(int i=0;i<rows;i++) *(matrix+i) = malloc(sizeof(int) * cols); // 为每行分配列内存 // 生成随机数填充矩阵 srand(time(NULL)); for(int i=0;i<rows;i++) for(int j=0;j<cols;j++) *(*(matrix+j)+i) = rand() % 20; // 打印矩阵 printf("{\t"); for(int i=0;i<rows;i++) { int j; if(i>0) printf("\t"); printf("{\t"); for(j=0;j<cols;j++) printf("%d\t",*(*(matrix + j) + i)); printf("}"); if(i<rows-1) printf("\n"); } printf("\t}\n\n"); // 释放矩阵内存 for(int i=0;i<rows;i++) free(matrix[i]); free(matrix); matrix = NULL; return 0; }
问题根源
你分配的是rows行cols列的矩阵:
matrix是一个包含rows个int*的指针数组,每个元素指向一块容纳cols个int的内存- 但在填充和打印时,错误使用了
*(*(matrix+j)+i)(等价于matrix[j][i]),把行下标和列下标搞反了 - 当
j >= rows时(比如测试用例中rows=2,j=2),matrix[j]超出了指针数组的边界,指向未分配的内存,直接访问会触发内存冲突
方形矩阵时rows=cols,j的最大值刚好等于rows-1,不会越界;行数大于列数时,j的最大值小于rows,也不会越界,所以这两种情况能正常运行。
修复后的代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> int main() { int rows = 2; int cols = 3; int **matrix = malloc(sizeof(int*) * rows); for(int i=0;i<rows;i++) *(matrix+i) = malloc(sizeof(int) * cols); srand(time(NULL)); // 修正下标:matrix[i][j] 对应第i行第j列 for(int i=0;i<rows;i++) for(int j=0;j<cols;j++) *(*(matrix+i)+j) = rand() % 20; printf("{\t"); for(int i=0;i<rows;i++) { int j; if(i>0) printf("\t"); printf("{\t"); // 同步修正打印时的下标 for(j=0;j<cols;j++) printf("%d\t",*(*(matrix + i) + j)); printf("}"); if(i<rows-1) printf("\n"); } printf("\t}\n\n"); // 释放内存逻辑不变 for(int i=0;i<rows;i++) free(matrix[i]); free(matrix); matrix = NULL; return 0; }
说明
修复了填充循环和打印循环中的下标顺序,确保matrix[i]始终访问的是有效行指针(范围0~rows-1),不会触发内存越界访问。
内容的提问来源于stack exchange,提问作者Frank S.
相关产品推荐
相关产品推荐

