大小不会增加,但会存储更大的数据。这怎么可能?

时间:2019-01-31 09:22:50

标签: c arrays strcpy

我正在gcc6.3中尝试此代码:

char a[2];
char b[]="Aditya";
strcpy(a,b);
printf("%s %lu\n",a,sizeof(a));

输出为:

aditya@aditya-Gateway-series:~/luc$ ./a
Aditya 2 

如何将变量a仍设为2字节大并存储7字节的信息?

3 个答案:

答案 0 :(得分:4)

在您的代码中:

strcpy(a,b);

在尝试访问无效的内存时调用undefined behaviour。不要依赖结果。

详细地说,a仅具有两个char的存储空间,如果您尝试写(在此处复制)多于一个单字符字符串(使用null终止符),您将超出分配的内存,从而进入无效的内存位置。

strcpy()b的源缓冲区具有更多内容,可以放入目标缓冲区a中,因此操作涉及边界溢出。确保目标缓冲区具有足够的内存是程序员的职责。


也就是说,关于大小计算-让我添加一下,数组大小,一旦定义,就无法更改。您可以选择填充内容以使其统一化/未使用,但是数组一旦定义,就无法调整大小。

答案 1 :(得分:1)

如Sourav Ghosh所说,您对strcpy的使用是不正确的,并且会导致未定义的行为。我认为发生的情况是a的大小为2,b的大小为ob,并且它们恰好彼此相邻放置在内存中,从而导致连续分配了9个字节的内存。因此,复制后,a的大小仍为2,并且保持"Ad"的大小-但是,打印将显示整个字符串,同时继续打印直到第一个字符串结尾字符。如果您打印b,我想您会得到"itya"的原因,因为它的地址位于a旁边2个字节。 我希望这足够清楚,并且对您有帮助!

答案 2 :(得分:1)

a仅包含{'A', 'd'}-其余字符在{em> a之后写入存储器。就您而言,您没有覆盖任何重要内容,因此代码似乎可以按预期运行。

出现。超出数组末尾的写入行为是 undefined ,这意味着编译器或运行时环境无需以任何特定方式处理这种情况。 C不需要对数组访问进行边界检查-如果您写到数组末尾,它不会引发异常。您的代码可能立即崩溃,您 may 损坏的数据结束时,它 may 会使程序处于错误状态,从而使其稍后崩溃(这些情况调试起来很有趣,让我告诉您),否则可能没有明显问题。

程序员(您)应确保目标数组足够大以容纳新值。语言在这里根本无法保护您。