Valgrind说"堆栈分配",我说"堆分配"

Joe*_*son 7 c malloc valgrind calloc

我试图跟踪valgrind的段错误.我从valgrind得到以下消息:

==3683== Conditional jump or move depends on uninitialised value(s)
==3683==    at 0x4C277C5: sparse_mat_mat_kron (sparse.c:165)
==3683==    by 0x4C2706E: rec_mating (rec.c:176)
==3683==    by 0x401C1C: age_dep_iterate (age_dep.c:287)
==3683==    by 0x4014CB: main (age_dep.c:92)
==3683==  Uninitialised value was created by a stack allocation
==3683==    at 0x401848: age_dep_init_params (age_dep.c:131)
==3683== 
==3683== Conditional jump or move depends on uninitialised value(s)
==3683==    at 0x4C277C7: sparse_mat_mat_kron (sparse.c:165)
==3683==    by 0x4C2706E: rec_mating (rec.c:176)
==3683==    by 0x401C1C: age_dep_iterate (age_dep.c:287)
==3683==    by 0x4014CB: main (age_dep.c:92)
==3683==  Uninitialised value was created by a stack allocation
==3683==    at 0x401848: age_dep_init_params (age_dep.c:131)
Run Code Online (Sandbox Code Playgroud)

但是,这是违规行:

 /* allocate mating table */
  age_dep_data->mtable = malloc (age_dep_data->geno * sizeof (double *));
  if (age_dep_data->mtable == NULL)
    error (ENOMEM, ENOMEM, nullmsg, __LINE__);
  for (int j = 0; j < age_dep_data->geno; j++)
    {      
 131=>     age_dep_data->mtable[j] = calloc (age_dep_data->geno, sizeof (double));
      if (age_dep_data->mtable[j] == NULL)
 error (ENOMEM, ENOMEM, nullmsg, __LINE__);
    }
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?我以为任何对malloc或calloc的调用都分配了堆空间; 这里没有分配其他变量,对吧?有可能还有另一个分配(有问题的堆栈分配),我没有看到吗?

编辑:我当前的怀疑是一个堆栈分配的数组:我声明一个指向double(堆栈)的指针,然后为其分配一个返回double*的函数的结果.然后我把它记忆到以前分配的地方.

我无法记住,memcpy或分配一个堆栈变量,然后希望它会持续存在,是吗?

Joe*_*son -1

我发现这个 valgrind 错误

Conditional jump or move depends on uninitialised value(s)
Run Code Online (Sandbox Code Playgroud)

一直发生并且不是错误的根源。自从发布这个问题以来,在我遇到的大多数情况下,这似乎是一个转移注意力的问题。