C中的“中止陷阱:6”错误?

Posted

技术标签:

【中文标题】C中的“中止陷阱:6”错误?【英文标题】:"Abort trap: 6" error in C? 【发布时间】:2017-05-11 11:27:45 【问题描述】:

我是 C 初学者,但我通过终端上的 gcc 在 xcode 上运行此代码:

#include <stdio.h>
#include <string.h> 
int main()
    char name[12] = "Roman Mirov"; 
    printf("My name is %s\n", name);
    name[8] = 'k'; 
    printf("My name is %s\n", name);
    char greeting[] = "hello"; 
    printf("%s %s\n", greeting, name);
    strcpy(greeting, "greetings, "); 
    printf("%s%s\n", greeting, name);
    return 0;

它会输出这个:

My name is Roman Mirov
My name is Roman Mikov
hello Roman Mikov
Abort trap: 6

我的问题是,为什么它会产生错误而不是将最后一行显示为输出“greetings, Roman Mikov”?

【问题讨论】:

这里没有问题!!! 这两个线程将有助于您更好地理解关于写入您不拥有的内存的关键点。 ***.com/questions/26431147/abort-trap-6-error-in-c***.com/questions/29401116/abort-trap-6-in-c-program @barakmanos 如果您看不到问题,我会解决这个问题。 是的,我终于能看到了,但你还是应该让它更清楚。 【参考方案1】:

在这种情况下,目标greeting 没有足够的空间来包含 的全部内容,因此它是调用undefined behavior 的越界访问。

详细来说,数组greeting的大小由提供的初始化器的大小决定,

char greeting[] = "hello";

在这种情况下,"hello" 使大小为 6,包括空终止符。

现在,稍后您尝试将更大的字符串放入内存中,

strcpy(greeting, "greetings, ");

其中,源大小为 12 个字节,而目标仅包含 6 个字节。这会导致边界溢出,结果为 UB。崩溃(或中止)是 UB 可能的副作用之一。

【讨论】:

如果新值比以前的值大,有没有办法改变字符串(整个数组)的值? @Roman 好吧,使用数组,无法调整大小。您可以考虑动态内存分配,例如malloc()realloc(),这是必要的。 @Roman 对于这个简单的程序,您只需为greeting 指定一个大小,该大小足以容纳您可能想要放入的所有问候语。否则,动态分配就是你的朋友,就像 Sourav 说的那样。 好的。谢谢。现在,让我困惑的是一位导师如何轻松避免我的问题here @Roman 1) UB 就是 UB,没有解释。 2)停止并停止观看该教程,N O W.【参考方案2】:

在这一行中,您分配了一个由 5+1 个字符组成的数组:

char greeting[] = "hello";

在这一行中,您尝试将 11+1 个字符写入该数组:

strcpy(greeting, "greetings, ");

【讨论】:

【参考方案3】:

在这种情况下,greeting 变量是 char 的数组,大小为 6(因为 hello\0 )。

所以当您使用strcpy(greeting, "greetings, ");"greetings, " 复制到greeting 时是不能的。因为greeting 不足以包含带有11+1 字符的数组

=>这里有错误abort trap : 6

【讨论】:

以上是关于C中的“中止陷阱:6”错误?的主要内容,如果未能解决你的问题,请参考以下文章

C Hangman 程序调试辅助(中止陷阱:6 错误)[关闭]

从 OS X 中的 main 返回但不在 linux 上时中止陷阱 6

我无法按字母顺序对文件中的“姓氏”进行排序:我得到中止陷阱:6

使用 py2app 捆绑 PyQt5 应用程序:不断收到“中止陷阱:6”错误

由于信号,命令失败:中止陷阱:6

使用 memset() 获取“中止陷阱 6”