中止陷阱:使用C中的数组处理时出现6错误
我是C的初学者,正试图通过简单的练习来更熟悉数组和手动内存分配的概念。我一直在阅读所有有关“中止陷阱:6”错误的(许多)问题,虽然我学到了很多东西,但他们还没有解决我的问题。中止陷阱:使用C中的数组处理时出现6错误
类似线程我检查了包括:
"Abort trap: 6" running C program on a Mac
...多,比我处理所有稍有不同。
这个问题似乎是我正在写给我无法访问的内存,但我认为通过使数组足够大,当我声明它时,我会避免这个问题。很明显我错了!
该代码应该是简单地创建一个数组,其中包含100个整数(位置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;
}
你的问题是你for
循环:
for (int i = 0; i < sizeof(obvs); i++)
更具体地说,你porblem是你的终止条件:
i < sizeof(obvs)
当你的代码编写,sizeof(obvs)
将返回分配的内存大小(在这种情况下,由于int需要4个字节的长度,所以这是404字节)内存)到你的数组,而不是数组的大小,101,就像你可能期望的那样。
更改为循环读取:
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;
}
当你填充数组超出其大小时,行为就是UB。当你填充数组中的值时,你正在填充101 * 4个元素。由于它是整数数组,每个元素将占用4个字节。在这种情况下,sizeof(int)
是4.所以你必须用sizeof(ovs)
除以数组元素的大小。因此改变 i < sizeof(obvs);
到i < sizeof(obvs)/sizeof(obvs[0]);
'I'的sizeof(obvs)' - >'I'的sizeof(obvs)/的sizeof(obvs [0])'(也'INT obvs [101];' - >'int obvs [100];') – BLUEPIXY
ovs的大小是4 * 101字节。 – MCG
谢谢你的评论!我的初学者头脑需要一些时间来包裹他们,但后来我意识到问题是我认为我知道什么是int的大小,当我明显没有。哈哈,小白。 :)再次,谢谢你们。 – ChiselD