3

我编写了这个简单的 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 最终也被修改。如果有人让我知道发生了什么,我将不胜感激:) 谢谢

./program 3 示例/mountdir/location2.csv 示例/rootdir/location2.csv

输出:

示例/rootdir/location2.csv

端线

4

2 回答 2

6

您正在超出缓冲区。原始的 argv[2] 和 argv[3] 在内存中很可能是连续的。当你strcat到 argv[2] 的末尾时,它正在写入 argv[3] 指向的内存。您需要分配新的缓冲区来保存您尝试创建的较大字符串。

于 2011-08-16T12:48:00.893 回答
3

首先,您不能写入 argv[2]。(这样做会产生依赖于实现或未定义的行为。区别并不重要:不要这样做)。

第二; 混乱在哪里?您可能在 argv[1] 之后立即使用 argv[2] 布置了内存,因此它看起来像“example/mountdir/location2.csv\0example/rootdir/location2.csv”。argv[ 2 ] (path) 指向第一个“e”,path2 指向空字节后面的“e”。当您 strcat 到路径时,您正在从 \0 开始写入数据,因此 \0 被替换为“。”,“e”被替换为 endlines 的“e”等,现在 path2 指向第二个字符串'.endlines'的字符,所以你打印它并得到输出“endlines”。

于 2011-08-16T12:55:45.687 回答