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

+0

아니요, @Mike - 문제 자체는 C의 메모리 관리를 기반으로합니다. ObjC 런타임이 필요한 유일한 것은'@ autoreleasepool'입니다. ObjC 객체가 없기 때문에 아무 것도하지 않습니다. 문자 그대로 'NSString'때문에 ObjC로 컴파일해야하지만, 실제 문제 나 솔루션에는 아무런 영향이 없습니다. 이 두 가지는이 코드의 컴파일 가능성에 영향을 미치지 않고 제거 될 수 있으며 문제는 C의 도메인과 동일하고 정교합니다. –

답변

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에서 코딩 할 때이 오류를 자주 일으키지 않을 때이 오류가 자주 발생합니다. –

0

크기가 0 인 배열을 정의했습니다. 배열은 메모리 블록이고이 경우 "메모리 없음"블록이므로 아무 것도 저장할 수 없습니다.

@ Owen의 대답에 표시된대로 malloc/free를 사용할 수 있습니다. 또한 C99은 스택에 배열을 선언하는 기능 (VLA, Variable Length Arrays)을 추가했습니다. 이렇게하면 malloc/free를 사용하지 않아도되지만 스택 공간을 모두 차지할 위험이 있습니다.

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

int arr[size]; 

.... 

참고 배열의 크기를해야하기 때문에 C89/C90/ANSI에서 당신이 그렇게 할 수 없을 것이라는 점 : 당신은 사실이 제한됩니다 알고 가치를 들면, VLA는 의미 할 수도 있습니다 컴파일 타임 상수.

+0

감사합니다 !!! 모든 도움을 주시면 감사하겠습니다. 나는 C++에서 오는 객관적인 C를 가르쳐 주므로 분명히 확실합니다. 더 많은 질문이 있습니다. –

관련 문제