我写了这个简单的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应用于路径,但最终也会修改path2。如果有人让我知道发生了什么,我将非常感谢:)谢谢
运行
./ program 3 example / mountdir / location2.csv 例如/ ROOTDIR / location2.csv
输出:
示例/ ROOTDIR / location2.csv
endlines
答案 0 :(得分:5)
你正在超越缓冲区。原始的argv [2]和argv [3]很可能在内存中连续。当你strcat
到argv [2]的末尾时,它正在写入内存argv [3]点。您需要分配新缓冲区来保存您尝试制作的较大字符串。
答案 1 :(得分:3)
首先,你不能写入argv [2]。 (这样做会产生依赖于实现或未定义的行为。区别是不重要的:不要这样做。)
二;困惑在哪里?您可能在argv [1]之后立即使用argv [2]进行内存布局,因此它看起来像“example / mountdir / location2.csv \ 0example / rootdir / location2.csv”。 argv [2](path)指向第一个'e',path2指向空字节后面的'e'。当strcat到path时,你正在从\ 0开始写入数据,所以\ 0被'。'替换,'e'被'e'替换为endlines等,现在path2指向第二个字符串'.endlines'的字符,因此您打印它并获得输出“endlines”。