gpt4 book ai didi

c - strcpy 的 valgrind 错误

转载 作者:IT王子 更新时间:2023-10-29 01:01:35 26 4
gpt4 key购买 nike

此代码应该从 userInput 空终止字符串中提取路径

  /* begin createPath */
static inline char* createPath(char * userInput)
{/* This function retuns the path from the userInput */
int pathStringLength = 0;
char *buf = userInput;
while(*(buf++) != ' ')
pathStringLength++;
char *path = malloc(pathStringLength+1);
strncpy(path, userInput, pathStringLength);
// memcpy(path, userInput, pathStringLength);
path[pathStringLength+1] = '\0';
return path;
}
/* end createPath */

根据valgrind,这段代码有错误:

> ==2919== Conditional jump or move depends on uninitialised value(s)
> ==2919== at 0x400A87: createPath (in /home/aral/learn/myShell/myShell)
> ==2919== by 0x400A4C: parseInput (in /home/aral/learn/myShell/myShell)
> ==2919== by 0x4009C3: main (in /home/aral/learn/myShell/myShell)
> ==2919==
> ==2919== Invalid write of size 1
> ==2919== at 0x400AC3: createPath (in /home/aral/learn/myShell/myShell)
> ==2919== by 0x400A4C: parseInput (in /home/aral/learn/myShell/myShell)
> ==2919== by 0x4009C3: main (in /home/aral/learn/myShell/myShell)

在 stackoverflow 上搜索类似问题,有些人谈到添加一个空终止符,而另一些人提到使用 memcpy 而不是 strcpy;无论如何我都添加了一个 null 并且我尝试使用 memcpy 但没有任何改进,valgrind 一直在提示。

我到底做错了什么?我该如何解决?

最佳答案

path[pathStringLength+1] = '\0';

错了。那是末尾的一个字节。你的意思是:

path[pathStringLength] = '\0';

如果输入字符串没有空格,您也会遇到缓冲区溢出。检查循环中的空终止符并在遇到时终止。我会这样写:

while (*buf != ' ' && *buf != '\0')
{
pathStringLength++;
buff++;
}

就其值(value)而言,我认为 memcpy 在这里可能是更好的选择。一旦您准确计算出需要复制多少文本,您也可以将其 blit 过来。不需要查找空终止符的字符串函数。你,一旦你修复了代码,就已经检查过了。

而且你应该检查malloc的返回值。

关于c - strcpy 的 valgrind 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13903248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com