我正在try 在C(就地)中转置一个(非正方形)矩阵.

****mats是指向动态分配的3D数组的指针

**ll是指向动态分配数组的指针,我在该数组中保存每个矩阵的行数

**lc是指向动态分配数组的指针,我在该数组中保存每个矩阵的列数

253 void transpose_mat(int ****mats, int **ll, int **lc, int k) {
254  int max_dim = (*lc)[k];
255  if ((*ll)[k] >= (*lc)[k])
256    max_dim = (*ll)[k];
257
258  (*mats)[k] = realloc((*mats)[k], max_dim * sizeof(***mats));
259  for (int i = 0; i < max_dim; ++i)
260    (*mats)[k][i] = realloc((*mats)[k][i], max_dim * sizeof(****mats));
261
262  for (int i = 0; i < max_dim; ++i) {
263    for (int j = i + 1; j < max_dim; ++j) {
264      int tmp = (*mats)[k][i][j];
265      (*mats)[k][i][j] = (*mats)[k][j][i];
266      (*mats)[k][j][i] = tmp;
267    }
268  }
269
270  int tmp = (*lc)[k];
271  (*lc)[k] = (*ll)[k];
272  (*ll)[k] = tmp;
273
274  (*mats)[k] = realloc((*mats)[k], (*ll)[k] * sizeof(***mats));
275  for (int i = 0; i < (*ll)[k]; ++i) {
276    (*mats)[k][i] = realloc((*mats)[k][i], (*lc)[k] * sizeof(****mats));
277  }
278}

Valgrindyields

1 2
1 2 

----transpose_mat
==18654== Conditional jump or move depends on uninitialised value(s)
==18654==    at 0x484DC80: realloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==18654==    by 0x10A67A: transpose_mat (my_octave.c:260)
==18654==    by 0x10B1CC: main (my_octave.c:436)
==18654==  Uninitialised value was created by a heap allocation
==18654==    at 0x484DCD3: realloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==18654==    by 0x10A60C: transpose_mat (my_octave.c:258)
==18654==    by 0x10B1CC: main (my_octave.c:436)
==18654== 
2 1
1 
2 

---- free_k_matrix
==18654== 
==18654== HEAP SUMMARY:
==18654==     in use at exit: 0 bytes in 0 blocks
==18654==   total heap usage: 14 allocs, 14 frees, 5,212 bytes allocated
==18654== 
==18654== All heap blocks were freed -- no leaks are possible
==18654== 
==18654== For lists of detected and suppressed errors, rerun with: -s
==18654== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

我错过了什么吗?

我try 初始化后,我重新锁定内存垫的价值观,但我最终与更多的错误和分段故障.

推荐答案

==18654== Conditional jump or move depends on uninitialised value(s)

该行告诉您有一个未初始化的值.

==18654==    at 0x484DC80: realloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)

该行告诉您,Valgrind发现在realloc routine 中使用了未初始化的值.

==18654==    by 0x10A67A: transpose_mat (my_octave.c:260)

这一行告诉您,从my_octave.c的第260行调用了realloc,即(*mats)[k][i] = realloc((*mats)[k][i], max_dim * sizeof(****mats));.

所以你知道realloc的一个参数没有初始化.max_dim以前使用过,因此没有早期投诉的事实表明我们可以得出结论,它是初始化的.sizeof(****mats)是常数.所以(*mats)[k][i]一定没有初始化.

初始化它.

C++相关问答推荐

如何确保内存分配在地址附近?

如何在不修改字符串缓冲区早期使用的情况下覆盖字符串缓冲区

是否定义了数组指针类型转换为指针类型?""""

在C中使用JMP_buf数组进行线程化(在xv6中测试)

Can函数指针指向C++中具有不同参数连续性的函数

如何在C客户端应用程序的ClientHello消息中添加自定义扩展?

C lang:当我try 将3个或更多元素写入数组时,出现总线错误

将宏值传递给ARM链接器,该链接器将变量放置在特定位置

用C语言计算文本文件中的整数个数

I2C外设在单次交易后出现故障

在C++中父进程和子进程中的TAILQ队列同步问题

在C++中允许使用字符作为宏参数

try 查找带有指针的数组的最小值和最大值

为什么会导致分段故障?(C语言中的一个程序,统计文件中某个单词的出现次数)

WSASocket在哪里定义?

C 语言中霍尔分区的快速排序算法

为什么创建局部变量的指针需要过程在堆栈上分配空间?

C simd _m128 晶圆厂

我该如何处理这个 C 90 代码中的内存泄漏?

将字节/字符序列写入标准输出的最简单形式