1

내가 발견 한 일부 동작에 대한 테스트를 수행했으며, 어떤 일이 일어나고 있는지 이해할 수 있는지 궁금합니다.가변 길이 배열을 사용할 때 Objective-C EXEC_BAD_ACCESS

나는 다음과 같습니다 myStruct라는 구조체,이 :

typedef struct { 
    int size; 
    float floats[]; 
} myStruct; 

을 그리고 난에이 코드를 실행 :

int main() { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSArray *a = [[NSArray alloc] initWithObjects:@"0.2", @"0.5", @"0.5", nil]; 

    NSLog(@"%@", a); 

    myStruct my; 
    my.size = a.count; 

    my.floats[0] = [[a objectAtIndex:0] floatValue]; 
    my.floats[1] = [[a objectAtIndex:1] floatValue]; 
    my.floats[2] = [[a objectAtIndex:2] floatValue]; 

    NSLog(@"{ %lf, %lf, %lf }", my.floats[0], my.floats[1], my.floats[2]); 

    [a release];  
    [pool drain]; 
    return 0; 
} 

그것은 잘 작동합니다. 나는이에 구조체 선언을 변경할 때 : 내가 선 [a release]를 호출 할 때

typedef struct { 
    float myVar; 
    int size; 
    float floats[]; 
} myStruct; 

나는 EXEC_BAD_ACCESS를 얻을.

아무도 내가 무슨 일이 일어나고 있는지 이해할 수 있습니까?

답변

4

에 대한 EXC_BAD_ACCESS를 얻을 빠른 테스트 후


! 이 라인 :

myStruct my; 

만 (두 번째 예 또는 myVarsize) size 충분한 스택 공간을 만든다. 실패한 경우 스택에 a을 덮어 쓰고 있지만 실제로 두 경우 모두 틀린 것처럼 보입니다. 문제를 해결하려면, 당신은 구조의 floats[] 회원을위한 공간을 할당해야 작업이 완료되면

myStruct *my = malloc(sizeof(myStruct) + a.count * sizeof(float)); 

free()을하는 것을 잊지 마세요!

빠른 예 - 프로그램 :

#include <stdio.h> 

typedef struct { 
    float myVar; 
    int size; 
    float floats[]; 
} myStruct; 

int main(int argc, char **argv) 
{ 
    printf("%zu\n", sizeof(myStruct)); 
    return 0; 
} 

그 출력 :

$ make testapp 
cc  testapp.c -o testapp 
$ ./testapp 
8 
+0

하지만 스택에 있지는 않습니다. 완료되면 무료로 보내주십시오! – deanWombourne

+0

@deanWombourne - 예. OP가 어떤 이유로 스택 할당을 정말로 필요로한다면'alloca()'가 도움이 될 것입니다. –

+0

감사! 나는 뭔가를 놓친다는 것을 알았다. :) –

2

당신은 당신의 수레에 대한 메모리를 할당하지 않습니다 - 나는 그것이 더 빨리 부서지는 것이 아닌가 놀랍습니다!

float [] 포인터에 대해 일부 메모리를 malloc해야합니까? 내가 MYSTRUCT 모두 정의 : 당신은 실제로 당신의 유연한 배열 구성원을위한 공간을 할당 할 필요가

+0

'[]'포인터없는 수레 - 그가요 멤버의 배열. 당신은 OP가 그 어레이를위한 약간의 공간을 할당 할 필요가 있다고 생각합니다! –

+0

너무 빨리 입력하는 중입니다. 실제로 스택에 유연한 배열을 할당하는 방법을 알지 못합니다. – deanWombourne

+0

아, 방금 대답에 대한 당신의 의견을 보았습니다 - 전에'alloca() '를 사용 해본 적이 없지만 알고 있으면 편리합니다. 매일은 학교 날입니다 :) – deanWombourne

관련 문제