【问题标题】:Abort trap: 6 error when working with array in C [duplicate]中止陷阱:在 C 中使用数组时出现 6 个错误 [重复]
【发布时间】:2018-01-25 07:51:27
【问题描述】:

我是 C 的初学者,我正在尝试通过做一些简单的练习来更熟悉数组和手动内存分配的概念。我一直在阅读关于“中止陷阱:6”错误的所有(许多)问题,虽然我学到了很多东西,但它们并没有解决我的问题。

我查看的类似主题包括:

"Abort trap: 6" running C program on a Mac

"Abort trap: 6" error in C?

...还有更多,都与我正在处理的内容略有不同。

问题似乎是我正在写入我无法访问的内存,但我认为通过在声明它时使数组足够大,我可以避免这个问题。显然我错了!

代码应该简单地创建一个包含 100 个 int 的数组(在位置 0 到 99),并为每个数组分配其位置的值(即数组中的第一项应该是 int 0,最后一个应该是 int 99)。当我运行这段代码时,我得到了所有的示例 printf 语句——其中包含正确的值——但是后面跟着一行“Abort trap: 6”。

有人可以看看我的代码并告诉我我做错了什么导致这个错误吗?

#include <stdio.h>


int main(void)
{
    int obvs[101];

    for (int i = 0; i < sizeof(obvs); i++)
    {
        obvs[i] = i;
    }

    printf("obvs[9] = %i\n", obvs[9]);
    printf("obvs[13] = %i\n", obvs[13]);
    printf("obvs[37] = %i\n", obvs[37]);
    printf("obvs[74] = %i\n", obvs[74]);
    printf("obvs[99] = %i\n", obvs[99]);

    return 0;
}

【问题讨论】:

  • i &lt; sizeof(obvs) --> i &lt; sizeof(obvs)/sizeof(obvs[0])(也叫int obvs[101]; --> int obvs[100];
  • Sizeof ovs 为 4*101 字节。
  • 感谢两位cmets!我的初学者头脑需要一点时间来围绕它们,但后来我意识到问题是我认为我知道 int 的大小是多少,而我显然不知道。哈哈,菜鸟。 :) 再次感谢你们。

标签: c arrays macos memory-management abort


【解决方案1】:

当您填充超出其大小的数组时,行为是 UB。当您在数组中填充值时,您将填充 101*4 个元素。由于它是整数数组,每个元素将占用 4 个字节。在这种情况下,sizeof(int) 是 4。所以你必须将sizeof(ovs) 除以数组元素的大小。因此改变 i &lt; sizeof(obvs);i &lt; sizeof(obvs)/sizeof(obvs[0]);

【讨论】:

    【解决方案2】:

    你的问题是你的for循环:

    for (int i = 0; i < sizeof(obvs); i++)
    

    更具体地说,您的问题是您的终止条件:

    i &lt; sizeof(obvs)

    在编写代码时,sizeof(obvs) 将向您的数组返回分配的内存大小(在本例中为 404 个字节,因为 int 需要 4 个字节的内存)而不是数组的大小,101,就像你可能期待的那样。

    将你的 for 循环更改为:

    for (int i = 0; i < 101; i++)
    

    for (int i = 0; i < (sizeof(obvs) / sizeof(int)); i++)
    

    它应该可以解决您的问题。养成的一个好习惯是在宏中存储常量值,这样可以保证每次使用时都使用相同的值(并且省去一些麻烦)。

    所以你可以重写你的代码来阅读:

    #include <stdio.h>
    
    #define ARRAY_SIZE 101
    
    int main(void)
    {
        int obvs[ARRAY_SIZE];
    
        for (int i = 0; i < ARRAY_SIZE; i++)
        {
            obvs[i] = i;
        }
    
        printf("obvs[9] = %i\n", obvs[9]);
        printf("obvs[13] = %i\n", obvs[13]);
        printf("obvs[37] = %i\n", obvs[37]);
        printf("obvs[74] = %i\n", obvs[74]);
        printf("obvs[99] = %i\n", obvs[99]);
    
        return 0;
    }
    

    【讨论】:

    • 非常感谢,迈克!我很欣赏详细的解释——它对像我这样仍处于非常基础水平的人有很大帮助。
    • @ChiseID 不客气!正如其他答案中所建议的那样,使用i &lt; sizeof(obvs)/sizeof(obvs[0])i &lt; sizeof(obvs)/sizeof(int) 也是一种好习惯。 sn-p 所做的是获取数组的大小,将其除以数组中每个元素的大小,从而返回数组中的总元素。我认为这通常是一个更好的解决方案,但是如果您要分配一个新数组并且您知道该数组总是具有相同的大小,那么在宏中定义该大小是一种很好的做法,可以让您的代码保持可读性并获得更好地理解数组的作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2017-05-11
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    相关资源
    最近更新 更多