【问题标题】:"Abort trap: 6" error in C?C中的“中止陷阱:6”错误?
【发布时间】: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”?

【问题讨论】:

标签: c arrays strcpy


【解决方案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

    【讨论】:

      猜你喜欢
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 2019-03-25
      相关资源
      最近更新 更多