0

this SO questionthis SO question을 알고 있습니다. 이 요소의 새로운 요소 은 Xcode와 공백에 대한 포인터를 역 참조하기위한 대괄호 (0123)를 사용합니다.Xcode에서 void * 경고 알림

다음 프로그램은 내가이 컴파일러 고려할 기억, 내가 지금 비주얼 스튜디오 이 없지만 GCC 4.2에 대한 경고와 함께 를 컴파일하고, 엑스 코드 4.5.2에서 경고없이 컴파일 오류 및 MSDN 및 인터넷 동의합니다.

#include <stdio.h> 

int main(int argc, const char * argv[]) 
{ 
    int x = 24; 

    void *xPtr = &x; 
    int *xPtr2 = (int *)&xPtr[1]; 

    printf("%p %p\n", xPtr, xPtr2); 
} 

I 메인의 몸의 세 번째 줄 변경하는 경우 :

int *xPtr2 = (int *)(xPtr + 1); 

그것은 모두 GCC와 엑스 코드에 경고없이 컴파일합니다.

나는 내가하여 (주는 int이며 작동하지만, 명시 적으로 값을 반환하지 않는 사실을 포함하여, GDB와 특히 엑스 코드/LLVM에, 경고 또는 오류로이 침묵을 설정하는 방법을 알고 싶습니다

내 생각에 - 벽은 GDB에서 트릭을한다.)

컴파일러 나던 포인터가 얼마나 큰지 알고있는 잘못된 모든 밤은

+0

xptr [1] !!! 방법?? xPtr은 void에 대한 포인터입니다. 2D 배열이 아닙니다. –

+0

@Anoop Vaidya : 잘못 알았습니다. Xcode는 그렇지 않습니다. 그리고 네, 2D 배열이 아니지만 아마도 "2 요소 배열"을 의미했을 것입니다. Visual Studio에서 xPtr [0]을 작성해도 오류가 발생했다고 생각합니다. 그 생각은 완전히 굉장합니다. – damix911

+0

잘못 되었기 때문에 컴파일러는 포인터가 얼마나 큰지 알지 못합니다 ... void [] ~~ void * –

답변

0

은 ... 빈 공간은 [] ~ 숯불 * 문자열로 사용하는 이유 무효 *
그게 전부는 \ 0을 할 필요가 죄송합니다 -

을가

void *v = nil; 
*v[1] = 0 //invalid 

void *v = malloc(sizeof(int)*2); 
*v[1] = 0 //valid 

* 참고가 SO에 인라인을 입력 컴파일시에 '포인터에 의해 메모리 포인터의 크기'는를 결정할 수 밤은 당신이 그것에 대해 경고를 켤 수 없습니다

로 끝나는 작동하지 않는 코드의 경우

+0

답장을 보내 주셔서 감사합니다. 필자는 컴파일러가 포인터가 얼마나 큰지 항상 알고 있고, 대부분의 현대 아키텍처에서 4 또는 8 바이트라고 생각합니다. 그것이 모르는 부분은 뾰족한 부분의 크기이지만 컴파일시에는 문제가되지 않습니다. malloc을 호출하여 필요한 공간을 할당 할 때 대답은이 부분에 초점을 맞추는 것처럼 보입니다. 나는 또한 Anoop Vaidya가이 방법을 언급했다고 생각한다. 컴파일 타임에 문제가 발생합니다. 컴파일러에 크기 정보가 제공되지 않고 기계 코드가 생성되지 않기 때문에 뾰족한 유형이 불완전하거나 무효 인 경우입니다. – damix911