Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
条件跳转或移动取决于Valgrind上strcmp的未初始化值?_C_String_Memory_Valgrind_Strcmp - Fatal编程技术网

条件跳转或移动取决于Valgrind上strcmp的未初始化值?

条件跳转或移动取决于Valgrind上strcmp的未初始化值?,c,string,memory,valgrind,strcmp,C,String,Memory,Valgrind,Strcmp,我收到Valgrind报告的以下错误: ==19634== Conditional jump or move depends on uninitialised value(s) ==19634== at 0x4C2E2D0: __strcmp_sse42 (vg_replace_strmem.c:852) ==19634== by 0x400908: main 因为我假设的是strcmp的使用。但是,我不知道在为两个输入设置值时使用了哪些未初始化的值。下面是一段代码,我向您展示了未

我收到Valgrind报告的以下错误:

==19634== Conditional jump or move depends on uninitialised value(s)
==19634==    at 0x4C2E2D0: __strcmp_sse42 (vg_replace_strmem.c:852)
==19634==    by 0x400908: main
因为我假设的是strcmp的使用。但是,我不知道在为两个输入设置值时使用了哪些未初始化的值。下面是一段代码,我向您展示了未初始化的值:

 53         strncpy(cmp1,sub,k-1); // first k - 1 of the new substring
 54         strncpy(cmp2,last->key + 1,k-1); // last k -1 of the previous/last substring
 55         if (strcmp(cmp1,cmp2) == 0) 
之前,我将值分配给cmp1和cmp2,然后使用strcmp。所以,我想知道问题是什么


编辑:请告诉我您是否希望显示更多代码。

strncpy
无法确保结果(dest)字符串以null结尾,并且您不会在两个复制的字符串的末尾放置任何NUL字符(
\0
)。因此,
strcmp
经过字符串的末尾,经过为它们分配的内存

解决此问题的一种方法是在调用strcmp之前添加终止NUL字符:

cmp1[k-1] = 0;
cmp2[k-1] = 0;
if (strncmp(cmp1, cmp2, k-1) == 0)
当然,我假设你有足够的空间来添加终止NUL字符

另一种更好的方法是使用
strncmp
而不是
strcmp

cmp1[k-1] = 0;
cmp2[k-1] = 0;
if (strncmp(cmp1, cmp2, k-1) == 0)
这样,您就不必复制字符串来进行比较:

if (strncmp(sub, last->key + 1, k-1) == 0)

如果您希望显示更多代码,请告诉我。
我会告诉您。请显示所需的代码,以便其他人在其计算机上编译您的代码并运行valgrind并获得相同的警告。例如,是否为
cmp1
cmp2
分配内存?仅因为将值复制到cmp1和cmp2中,并不意味着它们已初始化。它们来自的值可能未初始化,Valgrind会对此进行跟踪。
--track origins=yes
说什么@Tibrogargan不,我没有。但是下面的答案已经纠正了这个错误。我如何确保在这种情况下末尾有空字符来防止这种情况发生?非常感谢。btw@lameprogrammer01回答:谢谢。你能否进一步阐述这个问题?我完全不知道这是一件事——这是一个普遍的问题吗?通过将最后一个空格设置为NULL,我会影响程序的其他部分吗?在C中,0表示字符串的结束。如果省略结尾0,字符串操作函数将不知道字符串的结尾,并且将通过字符串的结尾,读取它们不应该读取的内存区域。使用strncmp(参见我的答案)