条件跳转或移动取决于 strcpy 处的未初始化值
Conditional jump or move depends on uninitialised value(s) at strcpy
Valgrind 在以下代码中检测到 strcpy
问题:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
char **array;
int mallocedLen = 15;
int arrLen = 10;
char tempArr[20][20] = {"abc", "123", "def", "456", "ghi", "789"};
int ii;
array = (char**)malloc(sizeof(char*) * arrLen);
for(ii = 0; ii < arrLen; ii++){
array[ii] = (char*)malloc(sizeof(char) * (strlen(tempArr[ii]) + 1));
strcpy(tempArr[ii], array[ii]);
array[ii][strlen(tempArr[ii])] = '[=10=]';
mallocedLen++;
}
return 0;
}
==4360== Conditional jump or move depends on uninitialised value(s)
==4360== at 0x483F0A2: strcpy (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
代码似乎编译得很好,所以我认为这不是 mallocing 的问题。
是strcpy(destination, source)
。
另外 strcpy()
0
- 终止复制。
所以替换
strcpy(tempArr[ii], array[ii]);
array[ii][strlen(tempArr[ii])] = '[=10=]';
来自
strcpy(array[ii], tempArr[ii]);
这里:
array[ii] = (char*)malloc(sizeof(char) * (strlen(tempArr[ii]) + 1));
strcpy(tempArr[ii], array[ii]);
您将 space 分配给 array[ii]
,然后当它还不包含有效字符串。
您似乎打算将 tempArr[ii]
作为来源:
strcpy( array[ii], tempArr[ii] ) ;
并且 nul 终止是不必要的 - strcpy()
已经这样做了。
Conditional jump or move depends on uninitialised value(s)
意思就是它所说的。例如 strcpy()
可能有:
while( *source != 0 )
{
...
}
但是*source
还没有初始化,所以循环可能重复也可能不重复。
另请注意,您是否已将 tempArr
声明为:
const char* tempArr[] = {"abc", "123", "def", "456", "ghi", "789"};
编译器会发现你的错误。我假设 tempArr
是不可变的?在这种情况下声明它。在构建时捕获语义错误总是比依赖运行时检测工具更好。在这种情况下,它的内存效率也更高。
另一个问题是:
for(ii = 0; ii < arrLen; ii++){
其中 arrlen 是 10 但 tempArr
只有 6 个初始化器。最好使用一个重要的值,例如 NULL 或空字符串。或者,如果您使用上面的 const char* tempArr[]
声明,则:
const char* tempArr[] = {"abc", "123", "def", "456", "ghi", "789"};
const int arrLen = sizeof(tempArr) / sizeof(*tempArr) ;
Valgrind 在以下代码中检测到 strcpy
问题:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
char **array;
int mallocedLen = 15;
int arrLen = 10;
char tempArr[20][20] = {"abc", "123", "def", "456", "ghi", "789"};
int ii;
array = (char**)malloc(sizeof(char*) * arrLen);
for(ii = 0; ii < arrLen; ii++){
array[ii] = (char*)malloc(sizeof(char) * (strlen(tempArr[ii]) + 1));
strcpy(tempArr[ii], array[ii]);
array[ii][strlen(tempArr[ii])] = '[=10=]';
mallocedLen++;
}
return 0;
}
==4360== Conditional jump or move depends on uninitialised value(s)
==4360== at 0x483F0A2: strcpy (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
代码似乎编译得很好,所以我认为这不是 mallocing 的问题。
是strcpy(destination, source)
。
另外 strcpy()
0
- 终止复制。
所以替换
strcpy(tempArr[ii], array[ii]);
array[ii][strlen(tempArr[ii])] = '[=10=]';
来自
strcpy(array[ii], tempArr[ii]);
这里:
array[ii] = (char*)malloc(sizeof(char) * (strlen(tempArr[ii]) + 1));
strcpy(tempArr[ii], array[ii]);
您将 space 分配给 array[ii]
,然后当它还不包含有效字符串。
您似乎打算将 tempArr[ii]
作为来源:
strcpy( array[ii], tempArr[ii] ) ;
并且 nul 终止是不必要的 - strcpy()
已经这样做了。
Conditional jump or move depends on uninitialised value(s)
意思就是它所说的。例如 strcpy()
可能有:
while( *source != 0 )
{
...
}
但是*source
还没有初始化,所以循环可能重复也可能不重复。
另请注意,您是否已将 tempArr
声明为:
const char* tempArr[] = {"abc", "123", "def", "456", "ghi", "789"};
编译器会发现你的错误。我假设 tempArr
是不可变的?在这种情况下声明它。在构建时捕获语义错误总是比依赖运行时检测工具更好。在这种情况下,它的内存效率也更高。
另一个问题是:
for(ii = 0; ii < arrLen; ii++){
其中 arrlen 是 10 但 tempArr
只有 6 个初始化器。最好使用一个重要的值,例如 NULL 或空字符串。或者,如果您使用上面的 const char* tempArr[]
声明,则:
const char* tempArr[] = {"abc", "123", "def", "456", "ghi", "789"};
const int arrLen = sizeof(tempArr) / sizeof(*tempArr) ;