首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strstr valgrind错误

strstr valgrind错误
EN

Stack Overflow用户
提问于 2011-09-05 03:12:45
回答 2查看 1.6K关注 0票数 0

我需要一些C中的char*初始化和strstr方面的帮助。这是一般的问题:

我有一个函数func1

func1() func2();

问题是valgrind给出了一个错误,基本上是说strstr可能使用了一个未初始化的值。为了纠正这个问题,我必须做一些像char* str = "hello world";这样的事情,但是我不能realloc,这是一个问题。

我已经用随机字符串测试了我的程序,问题是valgrind将str视为未初始化,但我只是不知道如何在不取消重新分配的能力的情况下初始化它。有什么建议吗?

错误是:

代码语言:javascript
复制
==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 

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

EN

回答 2

Stack Overflow用户

发布于 2011-09-05 03:38:22

在您的func1中,您具有以下内容:

代码语言:javascript
复制
        str = realloc(str, (stringLen + currExpLen) * sizeof(char)+2);
        sprintf(str, "%s %s", str, currExp);

sprintf的两端使用相同的字符串可能不是一个好主意。当输出被写入时,它将阻塞输入(str),这可能会导致任何方式的意外行为。realloc会处理任何可能需要的复制,所以你的sprintf可能会被一些strcat取代:

代码语言:javascript
复制
        str = realloc(str, (stringLen + currExpLen) * sizeof(char)+2);
        strcat(str, " ");
        strcat(str, currExp);
票数 0
EN

Stack Overflow用户

发布于 2011-09-05 04:34:33

我相信这就是你的问题:

在func2中:

代码语言:javascript
复制
    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是完成许多字符串操作任务的安全、简单和简单的方法,尽管它的效率可能会稍低一些。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7301534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档