我需要一些C中的char*初始化和strstr方面的帮助。这是一般的问题:
我有一个函数func1
func1() func2();
问题是valgrind给出了一个错误,基本上是说strstr可能使用了一个未初始化的值。为了纠正这个问题,我必须做一些像char* str = "hello world";这样的事情,但是我不能realloc,这是一个问题。
我已经用随机字符串测试了我的程序,问题是valgrind将str视为未初始化,但我只是不知道如何在不取消重新分配的能力的情况下初始化它。有什么建议吗?
错误是:
==14356== Conditional jump or move depends on uninitialised value(s)
==14356== at 0x4C29313: strstr (in path)
==14356== by 0x401983: func2 (in path)
==14356== by 0x401B06: func1 (in path)
==14356== by 0x4013D7: main (in path)
==14356==
==14358== Syscall param execve(argv[i]) points to uninitialised byte(s)
at 0x4ECFCB7: execve (in path)
==14308== by 0x4E6A76C: do_system (in path)
==14308== by 0x4013ED: main 编辑:在实际功能中添加、更改名称等。
发布于 2011-09-05 03:38:22
在您的func1中,您具有以下内容:
str = realloc(str, (stringLen + currExpLen) * sizeof(char)+2);
sprintf(str, "%s %s", str, currExp);在sprintf的两端使用相同的字符串可能不是一个好主意。当输出被写入时,它将阻塞输入(str),这可能会导致任何方式的意外行为。realloc会处理任何可能需要的复制,所以你的sprintf可能会被一些strcat取代:
str = realloc(str, (stringLen + currExpLen) * sizeof(char)+2);
strcat(str, " ");
strcat(str, currExp);发布于 2011-09-05 04:34:33
我相信这就是你的问题:
在func2中:
str = realloc(str, (stringLen + pathLen+1)*sizeof(char));
memmove(&str[rplcIndx + pathLen], &str[rplcIndx+2], stringLen-rplcIndx-2);
memcpy(&str[rplcIndx], path, pathLen);memmove不复制空终止符(它位于位置stringLen,但复制的最后一个字节将是rpcIndx+2+stringLen-rpcIndx-2-1 = stringLen-1 (记住,src[len]是未复制的第一个字节)。这意味着
空终止符的位置不正确字符串可能未正确终止
顺便说一句,如果可以,使用asprintf是完成许多字符串操作任务的安全、简单和简单的方法,尽管它的效率可能会稍低一些。
https://stackoverflow.com/questions/7301534
复制相似问题