中止陷阱:在C中使用数组时出错6次

时间:2017-08-17 03:01:10

标签: c arrays macos memory-management abort

我是C的初学者,我试图通过简单的练习更熟悉数组和手动内存分配的概念。我一直在阅读所有(很多)关于" Abort陷阱的问题: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语句 - 其中包含正确的值 - 但后面跟着一行说“"中止陷阱: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;
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您的问题是for循环:

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

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

i < 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;
}