2017-08-17 113 views
3

我是C的初学者,正试图通过简单的练习来更熟悉数组和手动内存分配的概念。我一直在阅读所有有关“中止陷阱:6”错误的(许多)问题,虽然我学到了很多东西,但他们还没有解决我的问题。中止陷阱:使用C中的数组处理时出现6错误

类似线程我检查了包括:

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

"Abort trap: 6" error in C?

...多,比我处理所有稍有不同。

这个问题似乎是我正在写给我无法访问的内存,但我认为通过使数组足够大,当我声明它时,我会避免这个问题。很明显我错了!

该代码应该是简单地创建一个数组,其中包含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; 
} 
+0

'I'的sizeof(obvs)' - >'I'的sizeof(obvs)/的sizeof(obvs [0])'(也'INT obvs [101];' - >'int obvs [100];') – BLUEPIXY

+0

ovs的大小是4 * 101字节。 – MCG

+0

谢谢你的评论!我的初学者头脑需要一些时间来包裹他们,但后来我意识到问题是我认为我知道什么是int的大小,当我明显没有。哈哈,小白。 :)再次,谢谢你们。 – ChiselD

回答

1

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

非常感谢,迈克!我很欣赏这个详细的解释 - 对于像我这样还处于一个非常基本的层次的人来说,这对我有很大的帮助。 – ChiselD

+0

@ChiseID不客气!如其他答案中所建议的那样,使用'i Mike

1

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