2017-12-22 14 views
-3
#include<stdio.h> 

int main(void){ 

    int a[3] = {1,2,3}; 
    int *p; 

    p = &a+2; 

    // here p and &a+2 will going to be same...having some particular address on memory 

    *p = 56; 

    // m writing 56 on *(p) or *(&a+2)... 

    printf("%d %d\n",*p,*(&a+2)); 

    return 0; 
} 

o/p는 내가 무엇인지 보여줍니다 !! *p = 56하지만 *(&a+2) = 같은 &a+2로 ... p = &a+1 것이 나에게 스매싱 스택을주고gcc의 포인터를 사용하여 수동 위치에 값을 저장하는 동안 오류가 발생했습니다.

...

이 사람이 나에게 설명 할 수 나에게 원하는 결과 56을 제공 *(*(&a+2))

... 무엇을 이것의 정확한 이유는 무엇입니까?

+0

예상되는 출력과 실제로 출력 한 것이 분명하지 않습니다. [mcve]를 제공하여이를 분명히하십시오. – hnefatl

+2

컴파일러 경고에주의하십시오 : https://ideone.com/vOCpGK. 이 코드는 정의되지 않은 동작을 호출합니다. –

+0

* pi는 56이고 p는 약간의 주소입니다 ... 그래서 56이 * 56 주소를 가지고 있어야합니다. (& a + 2) 주소 값을 얻었습니다 ... printf 명령문에 56이 있습니다. , 일부 주소 ... 대신 56,56 – Rucha

답변

0

p=a+2;이 아니라 p=&a+2;을 의미합니다. 후자는 배열a (&a)에 대한 포인터를 만들고 존재하지 않는 다른 배열 (존재한다면 다차원 배열에있는 행)에 대한 포인터를 형성하려고 시도합니다. 배열에 대한 포인터는 거의 사용되지 않으므로 사람들이 배열과 포인터를 혼동하는 데 도움이됩니다. decay. &a 두 개의 추가가 &asizeof(a)*2에 추가되므로

+0

!! p = a + 2는 & a [2]를 의미합니다 ...p = & a [2] ..를 의미합니다. 그러나 나는 & a + 2 ... aannn..suppose & a [0] = 100이고, 다음에 124를 p.so에 124를 저장함으로써 124에 56을 쓰고 있습니다. (& a + 2) !! – Rucha

+0

@ RuchiM.Mewada - 당신이 달성하고자하는 것이 확실하지 않습니다. 그러나 '& a + 2'는 어디에서나 합법적이라고 지적하지 않습니다. –

1
p = &a+2; 

p = &(a[6]); 

동등한 기능 및 sizeof(a)*2sizeof(a[0])*3*2는 동일하다. 결과 포인터를 역 참조하면 정의되지 않은 동작이 발생합니다. 정의되지 않은 동작은 배열의 끝을 넘어서기 때문입니다.


#include <stdio.h> 

int main(void) { 
    int a[3] = {1,2,3}; 
    int *p = &a+2; 
    printf("a @ %p\n", (void*)a); 
    printf("a @ %p\n", (void*)&a); 
    printf("a[0] @ %p\n", (void*)&(a[0])); 
    printf("a[2] @ %p\n", (void*)&(a[2])); 
    printf("p = %p\n", (void*)p); 
    printf("a[6] @ %p\n", (void*)&(a[6])); 
    return 0; 
} 

$ gcc -Wall -Wextra -pedantic --std=c99 a.c -o a && a 
a.c: In function ‘main’: 
a.c:5:14: warning: initialization from incompatible pointer type [enabled by default] 
    int *p = &a+2; 
      ^
a @ 0x3878b9c3030 
a @ 0x3878b9c3030 
a[0] @ 0x3878b9c3030 
a[2] @ 0x3878b9c3038 
p = 0x3878b9c3048 
a[6] @ 0x3878b9c3048 
+0

"& a"에 "sizeof (a) * 2"를 더합니다. – Max

+0

@Max, Thanks, fixed. – ikegami

+0

페 런트 릭 (pedantic) - 그들은 가장 느슨한 의미에서 "동등"하며 다른 유형입니다. –

0

사람이 뒤에 정확한 이유가 무엇인지 나에게 설명 할 수 있습니다?

추론은 정의되지 않은 동작을 호출하므로 컴파일러와 프로그램에서 원하는대로 수행 할 수 있습니다. 이것은 "정의되지 않은 동작"에 대한 정의입니다. 표준은 수행 할 올바른 것을 말하지 않으므로 프로그램에서 아무 것도 할 수 없습니다.

*(*(&a+2))이 올바른 답을 제공한다고해서 &a+2이 유효한 코드라는 의미는 아닙니다. 정의되지 않은 동작으로 인해 작동하는 프로그램이 생길 수있는 경우는 많이 있지만 그 이상의 프로그램을 계속 실행하거나 계속 변경하면 계속해서 컴파일된다는 보장은 없습니다.

여러 사람들이 이미 지적한 것처럼 정의되지 않은 동작은 호환되지 않는 포인터에 초기화되지 않은 주소를 할당하는 p = &a+2에서 발생합니다.

+0

tq !! 해결 됐어. – Rucha