gpt4 book ai didi

arrays - Valgrind错误-条件跳转或移动取决于未初始化的值

转载 作者:行者123 更新时间:2023-12-03 08:37:57 24 4
gpt4 key购买 nike

img of error
上面是我在程序中与这一行有关的一个错误:

storedData[k] = min(dist[index1][k],dist[index2][k]);
现在这是此行的周围函数:
for(int k = 0; k <arraySize; k++){
if(k!= index1 && k != index2){
if(method == SINGLE_LINKAGE){
storedData[k] = min(dist[index1][k],dist[index2][k]);
} else {
storedData[k] = max(dist[index1][k],dist[index2][k]);
}
}
}
现在,在使用它一段时间后,我意识到它的问题在于for循环中递增的“k”变量。更具体地说,担心当用作dist的索引时,返回的值将未初始化。现在,在功能方面,我的程序可以正常运行,并且可以执行我想做的所有事情。更值得注意的是,我还在辅助函数中的其他地方初始化了此函数,这就是为什么这会使我更加困惑。我已经初始化了索引0-arraysize中的所有值,这对我来说意味着永远不会成为问题。我不确定这是否是因为它是在main函数之外完成的。无论如何,它总是让我感到悲伤,我想解决它。

最佳答案

您需要从错误回到原点。即使您正在初始化数组,此后也有可能再次“未初始化”它们。 memcheck仅在复制会影响结果时才标记未初始化的数据。
所以用伪代码你可能有

Array arr;
Scalar uninit; // never initialized

init_array(arr);

// do some stuff
arr[3] = uninit; // no error here

for (i = 1 to arr.size)
store[i] = max(arr[i], arr[i-1]; // errors for i == 3 and 4
您可以尝试两种方法。首先,尝试进行一些“printf”调试,例如
for(int k = 0; k <arraySize; k++) {
if(k!= index1 && k != index2) {
fprintf(stderr, "DEBUG: k %d index1 %d index2 %d\n", k, index1, index2);
// as before
然后在没有日志文件的情况下运行Valgrind。然后,您应该能够看到哪些索引导致了错误。
接下来,尝试使用ggbserver。在一个终端中运行valgrind valgrind --vgdb-error=0 prog args然后在第二个终端中运行gdb进行附加(请参阅第一个终端中输出的文本以获取要使用的命令)。
然后,您可以像平常一样使用gdb(除非没有“运行”,否则)可以控制 guest 应用程序,并具有运行 valgrind monitor commands的附加功能。

关于arrays - Valgrind错误-条件跳转或移动取决于未初始化的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64913611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com