线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x7fff00000001)

时间:2013-03-11 18:23:00

标签: c arrays memory-management exc-bad-access

我正在尝试将数组传递给一个函数,该函数汇总了数组中的所有元素,但是在sum+=a[i];行遇到错误的访问错误我该如何解决这个问题?这是代码:

#import <Foundation/Foundation.h>

int sum(int*, int);

int main() {

@autoreleasepool {

    int size = 0;
    int a[size];
    int x;

    NSLog(@"Enter a size for the array ");
    scanf("%i", &size);

    NSLog(@"Enter %i numbers to populate the array ", size);

    for (int i = 0; i < size; i++) {
        scanf("%i", &a[i]);
    }

    x = sum(a, size);

    NSLog(@"The sum of the array is %i ", x);    
}

return 0;

}

int sum(int *a, int n) {

int sum = 0;
for (int i = 0; i < n; i++) {

    sum += a[i];
}
return sum;
}

2 个答案:

答案 0 :(得分:3)

这是因为你的数组大小为0。从[i]写入/读取可能会/可能不会崩溃,因为它的行为是未定义的。

而不是

int size = 0;
int a[size];
int x;

NSLog(@"Enter a size for the array ");
scanf("%i", &size);

你应该这样做:

int size = 0;
int *a;
int x;

NSLog(@"Enter a size for the array ");
scanf("%i", &size);

a = malloc(sizeof(int) * size);

通过动态分配数组a,您的程序不应再崩溃。

在我们使用malloc之后,当我们不再需要它时,我们必须释放它。把它放在return 0;

之前
free(a);

希望这有帮助。

答案 1 :(得分:0)

您已经定义了一个大小为0的数组。由于数组是一块内存,在这种情况下是一块“无”内存,因此您无法在其中存储任何内容。

您可以使用@ Owen的答案中指示的malloc / free。 C99还增加了在堆栈上声明数组的能力(所谓的VLA,可变长度数组)。这样可以节省使用malloc / free的费用,但会使您有可能耗尽所有堆栈空间。对于您知道事实的值将受到限制,VLA可能有意义:

int size;
NSLog(@"Enter a size for the array ");
scanf("%i", &size);

int arr[size];

....

请注意,在C89 / C90 / ANSI中,您将无法做到这一点,因为数组的大小必须是编译时常量。