我正在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字节的信息?
答案 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 会使程序处于错误状态,从而使其稍后崩溃(这些情况调试起来很有趣,让我告诉您),否则可能没有明显问题。
程序员(您)应确保目标数组足够大以容纳新值。语言在这里根本无法保护您。