2011-11-09 2 views

답변

1

처음 이후에 해당 주소를 문자열 CSTR가 가리키는 인쇄하고 있습니다. 정말 믿을 수 없습니다.

%x은 printf에 16 진수 값이 필요하다고 알려주고 포인터를 전달하기 때문에 그 주소를 가져 와서 인쇄합니다.

다음 :

printf("%s, %x, %d", cStr, cStr, cStr); 

도 진수 형식으로 주소를 인쇄합니다.

+0

포인터는 int와 크기 및 정렬이 동일 할 필요는 없습니다. –

+0

또한 16 진수 값도 않습니다 ...하지만 % x에서 작동 했으므로 추측하겠습니다. 또한 int로 작동합니다. 그럼에도 불구하고 그것은 정의되지 않았습니다. –

0

그리고 무엇을 기대 했습니까? cStr은 보통 숫자로 표시되고 종종 크기가 int 인 포인터입니다. 따라서 printf()는이 포인터의 값을 int 인 것처럼 인쇄 할 수 있습니다. 시스템의 sizeof (char *)> sizeof (int) 또는 포인터가 int와 별개의 정렬을 가지면 11046은 실제 포인터 값이 아니며, 포인터의 일부이거나 근처의 다른 메모리에있을 수 있습니다. 그리고이 코드는 C 표준에 따라 정의되지 않은 동작을 호출합니다.

0

정말 믿기지 않습니다. 정확합니다. C는 강력한 형식의 언어가 아닙니다. 예를 들어 문자도 숫자입니다 (8 바이트의 경우 0 - 255) ... 마찬가지로 포인터는 숫자입니다 (메모리 주소 일 수 있습니다). 포인터를 sizeof (void *) 바이트의 정수 값으로 처리 할 수 ​​있습니다. 당신이 숫자로 취급하기로 결정했다면, 그것은 마치 하나처럼 행동합니다.

int main() { 
     char *s = "Hello World"; 
     char *p; 

     for (p = s; *p ; p++) { 
       printf("p = %s, p = %x = %p, *p = %c = %u\n", p, p, p, *p, *p); 
     } 

} 

하고 그 결과를 즐길 ...

+0

코드가 올바르지 않습니다. 그리고 그 실행 중에 어떤 일이 일어 났는지 정확히 알지 못합니다. 그러나 그 결과는 어느 정도 예측 가능합니다. –

관련 문제