我是C的初学者,我试图通过简单的练习更熟悉数组和手动内存分配的概念。我一直在阅读所有(很多)关于" Abort陷阱的问题:6"错误,尽管我已经学到了很多,但他们还没有解决我的问题。
我签出的类似主题包括:
"Abort trap: 6" running C program on a Mac
......还有更多,与我所处理的情况略有不同。
问题似乎是我写给我无法访问的内存,但我认为通过在我声明它时使数组足够大,我会避免这个问题。显然我错了!
代码应该只是创建一个包含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;
}
答案 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;
}