2014-03-27 2 views
0

내 코드는 Objective-C와 C가 혼합 된 코드입니다. 아래 코드를 단순화했지만 여전히 동일한 오류가 발생합니다.메모리 오류를 일으키는 포인터를 사용하는 간단한 함수

CGFloat r,g,b = 0.5; 
CGFloat x,y,z = 0.0; 

foo(r, g, b , &x, &y, &z); 

그리고 C 부분 (수입 C 파일) : 오브젝티브 C 파일에서

void foo(CGFloat R, CGFloat G, CGFloat B, CGFloat *X, CGFloat *Y, CGFloat *Z) { 

    *X = 5; 
    *Y = 5; 
    *Z = 5; 

} 
포인터 중 하나에 무엇이에 할당 할 때 오류가 발생


는 - 그것은 EXS_BAD_ACCESS을 말한다 . 나는 무엇을 놓치고 있는가 (또는 정확하게 이해하지 못 했는가?). 동일한 프로젝트에서 .c 및 .m 파일을 분리해도 괜찮다고 가정합니다 ... 어쨌든 제대로 빌드하는 것 같습니다.

+0

디버거는 무엇을 말합니까? 'X/Y/Z'의 내용은 무엇입니까? –

+0

@BryanChen 디버거가 아무 말도하지 않고 X/Y/Z가 임의의 값으로 설정되어있는 것처럼 보입니다. 단지 64 비트에서 충돌하지 않는 것으로 나타났습니다. 32 비트에서만 ... 이상합니다. –

+0

어떻게 부르셨습니까? 실제 코드 –

답변

-1

모든 변수에 대해 메모리를 초기화해야합니다. 대신이 시도 :

CGFloat r = 0.5, g = 0.5, b = 0.5; 
CGFloat x = 0, y = 0, z = 0; 

foo(r, g, b , &x, &y, &z); 

을 목표 - C에서는 변수의 메모리 위치를 액세스하려고하면, 즉 &x을, 처음에 값을 할당하지 않고, 당신에게 EXS_BAD_ACCESS을 줄 것이다. 그러나 r, g 및 b는 초기화 할 필요가 없습니다 (그렇지 않은 경우 가비지 데이터가 있음).

+0

메모리를 초기화하는 것이 좋습니다. 하지만 충돌을 일으키지 않을 것입니다. –

+0

변수의 메모리 위치 (예 :'& x')에 값을 할당하지 않고 액세스하려고하면 Objective-c에서 실행됩니다. – Jason

+0

정말 ?? 이 경우 ObjC와 C가 어떻게 다른지 ?? 초기화되지 않은 변수의 주소가 어떻게 충돌을 일으키는 지 알 수 없습니다. 그것은 정의되지 않은 행동조차 아니다 (나는 생각한다). –

0

내 C 소스 파일의 헤더에는 CGFloat를 double로 선언하는 몇 개의 불법 라인이있었습니다. 내 C 파일의 모든 CGFloat를 삭제하고 float로 대체했습니다.

관련 문제