我正在学习C而且我不明白为什么我会在复制字符串时出现缓冲区溢出。
pathValue = getenv("PATH");
pathlength = strlen(pathValue);
pathValue2 = malloc(sizeof(pathValue));
strncpy(pathValue2, pathValue, pathlength);
你能告诉我应该怎么做吗?
答案 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)
它可能因多种原因而失败,例如
pathValue
是一个指针,你并不是所有malloc()
- 足够的内存来存储。strlen()
无法计算终止空值,因此您在使用pathValue2
strncpy()
时pathlength
错过了相同的内容。根本不使用这种方法。这malloc()
+ strncpy()
是我见过的最大陷阱之一。
相反,请学会使用strdup()
。最好不要错误地使用strncpy()
来解决问题。