两款C语言程序的Valgrind内存泄漏排查问询
两款C语言程序内存问题排查与修复
第一款程序问题分析
1. 数组越界访问
在设置主对角线上方元素的循环中:
//top diagonal for (int i = 0; i < ROWS; i++) { arr[i][i + 1] = -1; }
当i = ROWS - 1时,i + 1 = ROWS,超出数组列范围(假设ROWS == COLS),触发未定义行为,可能导致内存访问错误或程序崩溃。
2. 冗余指针强转
释放二维数组时的强转属于不必要写法,虽C语言允许,但可能掩盖类型不匹配问题:
free((double*)arr);
malloc返回的void*可直接赋值给任意指针类型,释放时无需强转。
第二款程序问题分析
1. 相同数组越界问题
与第一款程序一致,主对角线上方元素的循环存在越界,当i = ROWS - 1时访问arr[i][i+1]会超出边界。
2. 内存释放变量名错误
释放二维数组行内存的循环中,错误使用未定义变量array:
for(int i=0;i<ROWS;i++){ if(array[i] != NULL){ free(array[i]); arr[i] = NULL; } }
array未声明会导致编译错误;即使编译通过,也无法正确释放arr的每一行内存,造成内存泄漏。
3. 空指针解引用风险
当malloc(ROWS * sizeof(*arr))失败返回NULL时,后续arr[i][i]等操作会直接访问空指针,触发程序崩溃。
Valgrind输出解读
你提供的Valgrind输出中,所有内存泄漏均来自/usr/bin/dash(shell进程),而非你的程序。这可能是通过shell脚本运行程序导致Valgrind捕获了shell的内存分配。建议直接运行程序二进制文件重新检测:
valgrind --leak-check=full ./your_program
修复方案
第一款程序修复
- 修正数组越界:
//top diagonal for (int i = 0; i < ROWS - 1; i++) { arr[i][i + 1] = -1; }
- 移除冗余强转:
free(arr);
第二款程序修复
- 修正数组越界(同第一款);
- 修复变量名错误:
for(int i=0;i<ROWS;i++){ if(arr[i] != NULL){ free(arr[i]); arr[i] = NULL; } }
- 增加空指针判断,避免非法访问:
//allocation double** arr = malloc(ROWS * sizeof(*arr)); if(arr != NULL){ for (int i = 0; i < ROWS; i++) { arr[i] = malloc(COLS * sizeof(*arr[i])); assert(arr[i] != NULL); } } else { fprintf(stderr, "Failed to allocate memory for arr\n"); return 1; } // 后续访问arr前先判断非空 if(arr != NULL) { // diagonal、subdiagonal等循环代码 }
内容的提问来源于stack exchange,提问作者Κώστας Κατσάκος
相关产品推荐
相关产品推荐

