我正在学习c语言编程,我遇到了一些奇怪的事情。
我使用了char数组/字符串,并使用了不同的函数。所以我有这个程序,
#include <stdio.h>
int main(){
char a[] = {'H','e','y','a','\0'};
strcat(a,"bro!");
printf(a);
}
$ gcc -o test.o test.c -Wall
$ ./test.o
Heya bro!
$按预期工作,但如果我添加
#include <string.h>一开始,然后我得到了这个
$ gcc -o test.o test.c -Wall
$ ./test.o
Abort: trap 6
$发布于 2018-02-16 13:45:10
strcat试图追加字符,但是数组的大小仍然不足以容纳字符,从而产生undefined behavior。(在本例中,未定义的行为会导致您看到的错误--也可能是一切正常的情况)。因为strcat试图在数组a之外写入数据。printf的第一个参数应该是像printf("%s",a);这样的格式说明符。
char a[] = {'H','e','y','a','\0'};这里的a有5个元素。数组的大小为5。你需要一个更大的数组。
char a[9] = {'H','e','y','a','\0'};如果您让数组包含9个字符,那么它就可以工作了。
发布于 2018-02-16 14:29:12
初始化数组并省略维数时,编译器将根据初始值设定项的数量推断维数。
所以,这句话:
char a[] = {'H','e','y','a','\0'};等同于:
char a[5] = {'H','e','y','a','\0'};strcat()将源字符串的副本附加到目标字符串。它不检查目标缓冲区是否足够大以包含连接的结果字符串。如果目标不够大,不足以容纳连接的结果字符串,那么它会导致未定义的行为,包括它可能不正确地执行(崩溃或静默地生成不正确的结果),或者它可能做程序员想要做的事情。
您应该将buffer a的大小指定为足以容纳连接的结果字符串。在您的程序中,源字符串的大小为4。strcat()使用源字符串的第一个字符覆盖目标null字符,同时将它们连接在一起,并在形成的新字符串的末尾包含一个空字符。因此,在本例中,保存连接的结果字符串所需的最小大小为9。
将a声明为:
char a[9] = {'H','e','y','a','\0'};应该工作得很好。
正如大卫建议的(在评论中)而不是9,你可以采用一些合理的缓冲区大小,比如512或1024 (例如a[512]或a[1024])。它可以在一定程度上帮助你避免问题。但是,您需要注意代码中的缓冲区溢出问题。例如,您可以使用strncat(),它使您可以灵活地指定可以附加到目标字符串中的最大大小。
可以将要追加的最大字符数指定为-
(size of destination buffer) - (the length of the destination string) - 1以避免缓冲区溢出。
https://stackoverflow.com/questions/48820749
复制相似问题