为什么缓冲区溢出复制字符串?

时间:2015-05-19 16:26:55

标签: c string

我正在学习C而且我不明白为什么我会在复制字符串时出现缓冲区溢出。

pathValue = getenv("PATH");    
pathlength = strlen(pathValue);
pathValue2 = malloc(sizeof(pathValue));
strncpy(pathValue2, pathValue, pathlength);

你能告诉我应该怎么做吗?

3 个答案:

答案 0 :(得分:3)

pathlength = strlen(pathValue);
pathValue2 = malloc(sizeof(pathValue));
strncpy(pathValue2, pathValue, pathlength);

首先:

pathValue2 = malloc(sizeof(pathValue));

sizeof可能是也可能不是你之后的,我们需要看到pathValue才能确定。你可能是这个意思:

pathValue2 = malloc(strlen(pathValue)+1);

另请注意+1,这会为NULL终止符添加空间。

最后:

strncpy(pathValue2, pathValue, pathlength);

请使用:

strcpy(pathValue2, pathValue);

答案 1 :(得分:0)

您需要在pathlength中添加1以说明C字符串末尾的空终止字符。

pathValue2 = malloc(pathlength + 1);
strncpy(pathValue2, pathValue, pathlength + 1);

答案 2 :(得分:0)

它可能因多种原因而失败,例如

  1. pathValue是一个指针,你并不是所有malloc() - 足够的内存来存储。
  2. strlen()无法计算终止空值,因此您在使用pathValue2 strncpy()pathlength错过了相同的内容。
  3. 根本不使用这种方法。这malloc() + strncpy()是我见过的最大陷阱之一

    相反,请学会使用strdup()。最好不要错误地使用strncpy()来解决问题。