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

Abort trap: 6 error when working with array in C

我是 C 的初学者,我正在尝试通过做一些简单的练习来更加熟悉数组和手动内存分配的概念。我一直在阅读关于 "Abort trap: 6" 错误的所有(很多)问题,虽然我学到了很多,但他们还没有解决我的问题。

我检查过的类似线程包括:

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

...等等,都与我正在处理的略有不同。

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

代码应该简单地创建一个包含 100 个整数(位置 0 到 99)的数组,并为每个整数分配其位置的值(即数组中的第一项应该是整数 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;
}

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

你的问题是你的 for 循环:

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

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

i < sizeof(obvs)

在编写代码时,sizeof(obvs) 将 return 分配给数组的内存大小(在本例中为 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;
}