c - 中止陷阱 : 6 error when working with array in C

标签 c arrays macos memory-management abort

<分区>

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

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

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

"Abort trap: 6" error in C?

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

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

代码应该简单地创建一个包含 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;
}

最佳答案

你的问题是你的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;
}

关于c - 中止陷阱 : 6 error when working with array in C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45725937/

相关文章:

java - 查找数组中两个连续元素之间的最大差异时出现 ArrayIndexOutOfBoundsException

macos - 在 DiskArbitration 框架中注销回调的正确语法

c++ - SQLite 中的并发访问

arrays - Python 列表理解 => Ruby 选择/拒绝索引而不是元素

c - 如何使用 CreateProcess 识别崩溃的 child

android - Json 数组在 Android 中解析时返回 null

macos - 创建不在 OSX 上打开终端窗口的 Golang 可执行文件?

macos - Applescript 将 Safari 选项卡拆分为新窗口

c - 在c中将int结构数据类型写入文件

c++ - 计算嵌入式C中代码块的时钟周期