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]?
答案 0 :(得分:2)
您不应该对分配给argv[i]
指向的存储字符串的内存量做出任何假设。特别是,您不能假设您可以通过strcat
扩展这些字符串。这样做通常会导致未定义的行为。这正是您在实验中观察到的。
虽然修改argv[i]
指向的字符串而不改变它们的长度是合法的,但通常不可能将它们“扩展”到位。可以想象这些字符串可能会在内存中紧跟在一起,这意味着在argv[1]
指向的字符串末尾之外写入任何内容都会覆盖argv[2]
指向的字符串,依此类推。