为什么数组上的“strcat”会导致覆盖?

时间:2017-10-23 06:25:36

标签: c strcat

strcat(argv[1], ".txt");
puts(argv[1]);
strcat(argv[2], ".txt");
puts(argv[2]);
puts(argv[1]);

假设第一个([1])参数称为“a”,第二个([2])“b”。此代码提供以下输出: a.txt     txt.txt     a.txt.txt

为什么会这样?似乎strcat开始覆盖arg [2]?

1 个答案:

答案 0 :(得分:2)

您不应该对分配给argv[i]指向的存储字符串的内存量做出任何假设。特别是,您不能假设您可以通过strcat扩展这些字符串。这样做通常会导致未定义的行为。这正是您在实验中观察到的。

虽然修改argv[i]指向的字符串而不改变它们的长度是合法的,但通常不可能将它们“扩展”到位。可以想象这些字符串可能会在内存中紧跟在一起,这意味着在argv[1]指向的字符串末尾之外写入任何内容都会覆盖argv[2]指向的字符串,依此类推。