我需要一些关于char*
初始化和C中strstr
的帮助。这是一般问题:
我有一个函数func1
func1()func2();
问题是valgrind给出了一个错误,基本上说strstr可能正在使用未初始化的值。要纠正这个问题,我必须做char* str = "hello world";
之类的事情,但我不能realloc
,这是一个问题。
我用随机字符串测试了我的程序,问题是valgrind将str
视为未初始化的事实,但我只是不知道如何初始化它而不去掉realloc的能力。有什么建议?
错误是:
==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
编辑:在实际功能中添加,更改名称等。
答案 0 :(得分:0)
在func1
中,您有以下内容:
str = realloc(str, (stringLen + currExpLen) * sizeof(char)+2);
sprintf(str, "%s %s", str, currExp);
在sprintf
的两边使用相同的字符串可能是一个坏主意。当输出被写入时,它将破坏输入(str
),这可能导致任何意外行为。 realloc
负责处理可能需要的任何复制,因此您的sprintf可以被一些strcats取代:
str = realloc(str, (stringLen + currExpLen) * sizeof(char)+2);
strcat(str, " ");
strcat(str, currExp);
答案 1 :(得分:0)
我相信这是你的问题:
在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]
是第一个字节未复制)。这意味着
BTW,如果可以的话,使用asprintf
是安全,简单和万无一失的方法来完成许多字符串操作任务,尽管它可能效果稍差。