0

我正在尝试将一个数组传递给一个函数,该函数总结了数组中的所有元素,但是我在该行遇到了一个错误的访问错误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;
}
4

2 回答 2

3

这是因为您的数组大小为 0。从 a[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);

希望这可以帮助。

于 2013-03-11T18:28:38.503 回答
0

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

您可以按照@Owen 的回答中的说明使用 malloc/free。C99 还增加了在栈上声明数组的能力(所谓的 VLA,Variable Length Arrays)。这可以节省您使用 malloc/free 的时间,但会让您面临耗尽所有堆栈空间的风险。对于您知道的事实值将受到约束,VLA 可能有意义:

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

int arr[size];

....

请注意,在 C89/C90/ANSI 中,您不能这样做,因为数组的大小必须是编译时常量。

于 2013-03-11T19:27:34.450 回答