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

两款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

修复方案

第一款程序修复

  1. 修正数组越界:
//top diagonal
for (int i = 0; i < ROWS - 1; i++)
{
   arr[i][i + 1] = -1;
}
  1. 移除冗余强转:
free(arr);

第二款程序修复

  1. 修正数组越界(同第一款);
  2. 修复变量名错误:
for(int i=0;i<ROWS;i++){
   if(arr[i] != NULL){
      free(arr[i]);
      arr[i] = NULL;
   }
}
  1. 增加空指针判断,避免非法访问:
//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,提问作者Κώστας Κατσάκος

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:52:33