2012-08-15 3 views
1

이 프로그램의 출력을 이해할 수 없다?나는 내 프로그램은 아래와 같습니다

+0

'y'와'z'는 모두'x'를 가리 킵니다. 그래서'x'를 자신에게 할당하고 있습니다. 그런 다음 두 포인터를 증가시킵니다. 그렇다면'printf'에 전달하여 정의되지 않은 동작을 일으키고 있습니다 만 포인터가 아닌'int'를 기대하는'% d' 변환을 사용합니다 (포인터를 출력하고'void *'로 변환 한 다음'%' p). –

+0

@JerryCoffin 나는 이것에 녹슬 었어. 할당 된 공간 이상으로 가리 키도록하는 것이 합법적인가? – cnicutar

+4

@cnicutar : 예. 포인터의 역 참조를하지 않는 한 배열의 끝을 지나서 하나를 가리킬 수 있습니다. (C99, §6.5.6/7) : "이 연산자의 목적 상, 포인터가 아닌 객체에 대한 포인터 배열의 요소는 객체의 유형이 요소 유형 인 길이가 1 인 배열의 첫 번째 요소에 대한 포인터와 동일하게 작동합니다. " –

답변

3

그것은 동등의 :

*y = *z; 
y++; 
z++; 

내가 당신 포인터를 인쇄하고이 프로그램

의 출력을 이해 못할 이해하기 많지 않다. 당신이 그 포인터를 증가 할 때


  • 당신은 당신은 알려진 우주를 넘어 이동하고
  • %p 대신 %d의 인쇄 포인터를 사용한다
  • 과 동일
0

:

*y = *z; 
++z; 
++y; 
0

이것은 단순히 객체 poi의 값을 할당합니다. y에 의해 z에 의해 지시 된 객체의 그것들에 nted되고, 그 다음 두 포인터들을 증가시킨다.

0

y가 가리키는 객체의 값을 z가 가리키는 객체의 값에 할당하고 마지막으로 두 포인터를 증가시킵니다.

3

yz 포인터, 그리고 표현 y++z++는 후위 연산자를 사용하는, 그래서 모두 증가는 할당 후 을 발생합니다. *y = *z : 값이 같은 값이 z가 가리키는 y 가리키는

  1. 를 할당에 :

    이 문장은 3 일을한다.

  2. y 포인터를 증가시킵니다. 지금 y다음을 가리키며int을 메모리에 표시합니다.
  3. z 포인터를 증가시킵니다. 지금 z을 가리키고 다음은int을 가리 킵니다.

yz가 문 다음에 사용 된 경우 마지막 두 나쁜 것 : yz 이제 코드에 속하지 않는 초기화되지 않은 메모리를 가리 킵니다.

+0

후위 연산자가 *보다 우선합니다. 그래서 그것은 z 포인터를 먼저 증가시키고 역 참조하지 않을까요? – Ram

+0

죄송합니다. 후위 연산자의 효과는 명령을 실행 한 후에 만 ​​느껴집니다. 지금 바보 같은 느낌! – Ram

0

변수 yz은 정수를 가리키는 포인터이며,이 경우 변수 x의 주소를 가리 킵니다.

다음 라인들은 y의 값을 x의 주소 (즉, 주소)로 설정합니다.&x는`x '의 주소를 제공합니다.

y=&x; 
z=y 

다음 줄, *y++=*z++; 정확히 이해하고 수도 있고 사용되는 컴파일러에 따라 컴파일되지 수 없습니다. GCC 4.3.2의 경우 다음과 같은 오류가 발생합니다.

foo.c:7: error: invalid operands to binary * (have ‘int *’ and ‘int *’) 

포인터 연산을하는 것처럼 보이지만 약간의 연산자 우선 순위가 있습니다. 사전 증가 값을 위치에 할당 한 후 z이 가리키는 값을 증가 시키려고합니까?

+0

"z = y"문에 대한 세미콜론을 놓쳤으므로이 오류가 발생합니다. – Ram

1

*y++=*z++; - 포인터 z에 저장된 값을 *y에 할당하는 것입니다. 이 후 증가하는 yz 포인터. 이 문을 zy 모두 역 참조하면 충돌이 발생할 수 있습니다 (정의되지 않은 동작).

문 이런 종류

문자열 복사 구현에 사용되는

void my_strcpy(char *dest, char* src) 
{ 
    while((*dest++ = *src++)); 
} 
0
*y++=*z++; //wat does this mean? 

(다음 시퀀스 지점 전에 여러 변형) 정의되지 않은 동작에 상기 결과.

관련 문제