strcat古怪的行为

时间:2011-08-16 12:42:15

标签: c strcat

我写了这个简单的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

2 个答案:

答案 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”。