2017-03-17 9 views
4

이 코드를 테스트 중이지만 오류가없는 이유는 무엇입니까?전혀 오류가 없습니다. 이유가 무엇입니까?

#include <stdio.h> 

int main() 
{ 

    int a = 1025; 
    int *p; 
    p = &a; 

    // now I declare a char variable , 
    char *p0; 
    p0 = (char*) p; // type casting 
    printf("", sizeof(char)); 

    // is %d correct here ????? 
    printf("Address = %d, value = %d\n", p0, *p0); 

} 

내 질문 : 여기에 올바른 %d인가? %d은 문자가 아닌 정수이므로 왜 아무런 오류가 없습니까? char *가 다른 유형에 액세스하는 데 사용할 수 있기 때문에 귀하의 경우

p0 = (char*) p; 

에서

+1

실제로 문제는 주소를 전달하는 첫 번째'% d '입니다 :'% p'를 사용해야합니다. 'printf ("Address = % p, value = % d \ n", (void *) p0, * p0);'두 번째의 경우'char' 값은'int'로 승격됩니다. – LPs

+0

또한 에러/경고는 코드를 컴파일하는 방법에 따라 달라집니다 :'gcc -Wall -Wextra -pedantic-errors test.c -o test -std = c11 -g'을 사용하면'warning : format '% d' 인수 2는 'char *'유형을 갖습니다. [-Wformat =] printf ("주소 = % d, 값 = % d \ n", p0, * p0); ' – LPs

+0

[올바른 형식 (주소)?] (http://stackoverflow.com/q/9053658/995714) –

답변

4

는 유효합니다. 인용 관련 C11 장 §6.3.2.3

[...] 오브젝트 포인터가 캐릭터 타입에 대한 포인터로 변환되는 경우, 가장 낮은 결과 포인트가 객체의 바이트를 어드레싱. 결과가 연속적으로 증가하면 개체의 크기까지 개체의 나머지 바이트에 대한 포인터가 생성됩니다. 당신이 %d에 대한 포인터 (p0)를 전달하는로

그러나

printf("Address = %d, value = %d\n", p0, *p0); 

의 경우, undefined behavior의 원인 (변환 지정자 및 해당 인수의 최초의 "쌍"봐). 당신은 모든

없음 오류에 대답하지 않으려면 다음 %p를 사용하고

printf("Address = %p, value = %d\n", (void *)p0, *p0); 

처럼 void *에 뭔가를 인수 캐스팅해야한다, 왜?

컴파일러가 불만을 제기하는 구문이나 제약 조건 위반 문제가 아니기 때문에이 문제가 발생합니다. 그것은 주어진 힘이의 순전히 오용이다. :)

+0

일부 컴파일러는 형식 지정자 불일치에 대해 경고합니다. 예 : 최근 버전의 gcc와'-Wall'을 가진 clang –

+0

@Sourav Ghosh –

+0

@ M.M .: 많은 비 역풍 버전도 그렇게했습니다. 그것은 확실히 2.95 (c. 1999)에 있었고, 나는 이미 오래되었다고 생각합니다. – rici

1

p0char*이기 때문에 그것은 정의되지 않은 동작의 코드 printf("Address = %d, value = %d\n", p0, *p0)%d 문자 포인터에 대한 유효한 변환 지정하지 않습니다.

+2

'제약 조건 위반 '... 자세히 설명해 주시겠습니까? –

+0

고마워, 그냥 downvoted, 당신이 절대적으로 틀렸어. :) –

+0

@SouravGhosh 안녕하세요, 저는 대답을 변경했습니다. – rsp