我编写了这个简单的C程序,但我不太明白strcat这个奇怪的行为
long sum(long col, char* path, char* path2){
printf("%s\n",path2);
strcat(path,".endlines");
printf("%s\n",path2);
return 0;
}
int main(int argc, char* argv[]) {
int n=atoi(argv[1]);
sum(n,argv[2],argv[3]);
exit(EXIT_SUCCESS);
}strcat被应用在path上,但是path2最终也被修改了。如果有人告诉我发生了什么,我会非常感激的:)谢谢
跑
./Program3示例/mountdir/location2.csv示例/rootdir/location2.csv
产出:
示例/rootdir/location2.csv
端线
发布于 2011-08-16 12:48:00
您正在溢出一个缓冲区。最初的argv2和argv3很可能是连续的。当您strcat到argv2的末尾时,它是写到内存argv3点上的。您需要分配新的缓冲区来保存您要创建的更大的字符串。
发布于 2011-08-16 12:55:45
首先,您不能写到argv2。(这样做会产生依赖于实现或未定义的行为。区别并不重要:不要这样做)。
第二,混乱在哪里?您可能在"example/mountdir/location2.csv\0example/rootdir/location2.csv".之后立即使用argv2部署了内存,因此看起来类似于argv1argv 2 指向第一个'e',path2指向空字节后面的'e‘。在strcat到path时,您从\0开始写入数据,因此\0被‘.’替换为'.','e‘被'e’替换为‘e’,等等,现在path2指向字符串'. endlines‘的第二个字符,因此可以打印它并获得输出“endline”。
https://stackoverflow.com/questions/7078349
复制相似问题