2013-03-11 67 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

相關問題