首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >#include <string.h> ->中止陷阱: 6?

#include <string.h> ->中止陷阱: 6?
EN

Stack Overflow用户
提问于 2018-02-16 13:43:42
回答 2查看 160关注 0票数 0

我正在学习c语言编程,我遇到了一些奇怪的事情。

我使用了char数组/字符串,并使用了不同的函数。所以我有这个程序,

代码语言:javascript
复制
#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!
$

按预期工作,但如果我添加

代码语言:javascript
复制
#include <string.h>

一开始,然后我得到了这个

代码语言:javascript
复制
$ gcc -o test.o test.c -Wall
$ ./test.o
Abort: trap 6
$
EN

回答 2

Stack Overflow用户

发布于 2018-02-16 13:45:10

strcat试图追加字符,但是数组的大小仍然不足以容纳字符,从而产生undefined behavior。(在本例中,未定义的行为会导致您看到的错误--也可能是一切正常的情况)。因为strcat试图在数组a之外写入数据。printf的第一个参数应该是像printf("%s",a);这样的格式说明符。

代码语言:javascript
复制
char a[] = {'H','e','y','a','\0'};

这里的a有5个元素。数组的大小为5。你需要一个更大的数组。

代码语言:javascript
复制
char a[9] = {'H','e','y','a','\0'};

如果您让数组包含9个字符,那么它就可以工作了。

票数 3
EN

Stack Overflow用户

发布于 2018-02-16 14:29:12

初始化数组并省略维数时,编译器将根据初始值设定项的数量推断维数。

所以,这句话:

代码语言:javascript
复制
char a[] = {'H','e','y','a','\0'};

等同于:

代码语言:javascript
复制
char a[5] = {'H','e','y','a','\0'};

strcat()将源字符串的副本附加到目标字符串。它不检查目标缓冲区是否足够大以包含连接的结果字符串。如果目标不够大,不足以容纳连接的结果字符串,那么它会导致未定义的行为,包括它可能不正确地执行(崩溃或静默地生成不正确的结果),或者它可能做程序员想要做的事情。

您应该将buffer a的大小指定为足以容纳连接的结果字符串。在您的程序中,源字符串的大小为4strcat()使用源字符串的第一个字符覆盖目标null字符,同时将它们连接在一起,并在形成的新字符串的末尾包含一个空字符。因此,在本例中,保存连接的结果字符串所需的最小大小为9

a声明为:

代码语言:javascript
复制
char a[9] = {'H','e','y','a','\0'};

应该工作得很好。

正如大卫建议的(在评论中)而不是9,你可以采用一些合理的缓冲区大小,比如5121024 (例如a[512]a[1024])。它可以在一定程度上帮助你避免问题。但是,您需要注意代码中的缓冲区溢出问题。例如,您可以使用strncat(),它使您可以灵活地指定可以附加到目标字符串中的最大大小。

可以将要追加的最大字符数指定为-

代码语言:javascript
复制
(size of destination buffer) - (the length of the destination string) - 1

以避免缓冲区溢出。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48820749

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档