我正在尝试将数组传递给一个函数,该函数汇总了数组中的所有元素,但是在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;
}
答案 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中,您将无法做到这一点,因为数组的大小必须是编译时常量。