0

我需要一些关于char*初始化和strstrC 语言的帮助。这是一般问题:

我有一个功能func1

函数1()函数2();

问题是 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 

编辑:在实际功能中添加,更改名称等。

4

2 回答 2

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);
于 2011-09-04T19:38:22.483 回答
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不复制空终止符(它位于 position ,但复制的stringLen最后一个字节将是rpcIndx+2+stringLen-rpcIndx-2-1 = stringLen-1(记住src[len]第一个字节未复制)。这意味着

  • 空终止符的位置未初始化
  • 字符串可能未正确终止

顺便说一句,如果可以的话,使用asprintf是执行许多字符串操作任务的安全、简单和万无一失的方法,尽管它可能不太有效。

于 2011-09-04T20:34:33.053 回答