2013-05-21 5 views
-5
#include<stdio.h> 
void main() 
{ 
    int *c=12345; 
    printf("dec:%d hex:%x", c ,&c); // (1) 
} 

라인 (1) 8af123 분명히 따라 임의의 기계 인 주소C는 포인터에서 int를 해석하고 char 포인터와 다른 점은 무엇입니까?

dec:12345 hex:8af123 

를 출력한다.

나는 분명히

printf("dec:%d", *c); // (1) 

실패에 넣어합니다.

그래서 제 질문은 이론적 개념 당과 같습니다

  • *c는해야 값 12345를 보유하고 있지만이 아니다. 왜?

그리고이 코드에서 :

#include<stdio.h> 
void main() 
{ 
    char *c='a'; 
    printf("address store in c:%d value point by c:%c address of c:%x", c,*c ,&c); //Focus line 
} 

출력은 다음과 같습니다

adderess store in c:9105699 value point by c:a address of c:8af564 
  • 이 왜 c 대신 'A'*c에 저장됩니다?

gcc 컴파일러 4.4.3을 사용하고 있습니다.

+2

'str'은 무엇입니까? 'c'라는 뜻이야? – SLaks

+1

'str'은 무엇입니까? 나는 그런 선언을 여기서 보지 못한다. "C"와 관련이있을 수 있는가? –

+0

'int * c = 12345;'할 수 없다, 포인터'c '에 메모리를 할당하지 않았다. – Math

답변

11
int *c=12345; 

방금 ​​잘못된 주소 12345을 가리키는 포인터를 만들었습니다.

c (*)을 printf으로 전달하면 포인터 자체가 전달됩니다. 따라서 printf은 단순히 숫자 12345을보고 인쇄합니다. 그것은 그것이 포인터가되어야한다는 것을 알 수있는 방법이 없습니다.

당신이 *c을 통과하면

, printf, 당신은 당신이 메모리 주소 12345에 값을 전달하는 – 포인터를 역 참조입니다.
주소가 유효하지 않으므로 printf에 도달하기 전에 참조 해제 작업이 중단됩니다 (정확히 말하면 비정상적으로 동작합니다).

+4

또한 컴파일러가 진단 할 제약 조건 위반입니다. OP가이 메시지를 무시하지 않아야합니다.정수로 포인터를 초기화 할 수 없습니다 (널 포인터 상수 인 정수 상수 표현식 0 제외). –

+0

제약 조건 위반은 별개의 문제입니다 (기본 "dodgy 주소 사용"문제와 직각). 예를 들어, 'int * c = (int *) 12345;'는 타입 캐스트가 제약 조건 위반을 해결하더라도 많은 도움이 될 것이라고 확신하지 못합니다. – Brendan

1

그럼 내 질문은 이론적 개념에 따라 *str 값을 보유하지만 12345입니다. 왜?그것은 하지입니다

int *c; 
c=12345; 

과 동일 :

int *c=12345; 

같이 동일

int *c; 
*c=12345; 

여기에 C 언어의 의미 론적 특질이있다. *은 선언에 속하지만 특정 변수에만 적용됩니다.

당신은 * 데이터 유형에 옆으로 바꾸어 선언에 속한다는 사실 명확히 할 수

: 당신이 경우에 동일한 명령문에 여러 변수를 선언 할 때

int* c = 12345; // Don't format your declaration like this, 
       // see next example as to why 

, 당신은 문제로 실행됩니다 :

int* a, b, c; // a is a pointer to int, b and c are plain int 

// it is the same as: 
int *a; int b; int c; 

// and **not** 
int *a; int *b; int *c; 

따라서 *이 선언에 속한다는 것을 알면됩니다. 처음으로 유효한 주소를 c으로 지정하지 않으면 안전하게 *c을 할당 할 수 없기 때문에이 문제가 발생하지 않습니다.

왜 c 대신 'c'에 'a'를 저장합니까?

char *c='a'; 
    printf("%d %c %x", c,*c ,&c); //Focus line 

당신이 숯불에 포인터를 선언되는 메모리 위치 97 (a의 ASCII 값은 97이다)을 포인트. 그런 다음 숫자로 포인터를 인쇄하려고합니다 (97을 인쇄해야하지만 아래 참조). 메모리 위치 97의 값은 문자로 표시됩니다 (c은이 단계에서 유효하지 않은 포인터이므로 결과는 정의되지 않으며 주소는 포인터 c (c는 스택에 위치한 AOUT 변수입니다)

이 코드를 컴파일 할 때 나는 경고를 얻을 :. 초기화 캐스트없이 정수의 포인터를 만드는 문자 포인터에 97를 할당 할 때 c 합니다. cygwin에서이 코드를 실행하면 정의되지 않은 동작에서 Segmentation 오류가 발생합니다.

관련 문제