2013-03-11 68 views
0

我试图将一个数组传递给一个函数,该函数总结了数组中的所有元素,但是在行sum+=a[i];处遇到访问错误我解决这个问题?这里是代码:线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x7fff00000001)

#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

@Josh - 你为什么要拉''objective-c'标签来支持'C'?这显然是'objective-c'代码 – Mike 2013-03-11 19:31:00

+0

不是,@Mike - 问题本身完全基于C的内存管理。唯一需要ObjC运行时的是'@ autoreleasepool',由于没有放入ObjC对象,因此它并没有做任何事情。它必须被编译为ObjC,因为它使用了'NSString',但这些与实际问题或解决方案没有关系。这两件事都可以在不影响这段代码的可编译性的情况下被移除,问题将会是一样的,并且正好在C的域中。 – 2013-03-11 19:38:32

回答

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); 

希望这会有所帮助。

+0

谢谢你修复它。我经常在Xcode编码时不知道是什么导致它出现这个错误。 – 2013-03-13 05:28:36

0

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

您可以使用malloc/free,如@ Owen的答案中所示。 C99还增加了在栈上声明数组的能力(所谓的VLA,可变长度数组)。这可以避免使用malloc/free,但可能会使用所有堆栈空间。对于那些你知道一个事实,也将受到限制值,一个VLA可能是有意义的:

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

int arr[size]; 

.... 

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

+0

谢谢!所有的帮助表示赞赏。林教自己客观的C来自C++,所以即使生病了还有更多的问题。 – 2013-03-13 05:36:38

相关问题