programing

어레이 주소 지정 시 다른 포인터 연산 결과

prostudy 2022. 7. 29. 22:37
반응형

어레이 주소 지정 시 다른 포인터 연산 결과

프로그램:

#include<stdio.h>

int main(void) {
    int x[4];
    printf("%p\n", x);
    printf("%p\n", x + 1);
    printf("%p\n", &x);
    printf("%p\n", &x + 1);
}

출력:

$ ./a.out
0xbff93510
0xbff93514
0xbff93510
0xbff93520
$

상기 프로그램의 출력은 다음과 같습니다.예를 들어 다음과 같습니다.

x        // 0x100
x+1      // 0x104  Because x is an integer array
&x       // 0x100  Address of array
&x+1     // 0x104

하지만 마지막 진술의 결과는 내가 예상했던 것과 다르다. &x는 어레이의 주소이기도 합니다.따라서 여기서 1을 늘리면 주소가 4만큼 증가합니다.그렇지만&x+1주소를 10씩 늘립니다. 왜일까요?

x -> Points to the first element of the array.
&x ->Points to the entire array.

설명에 대해서는, http://arjunsreedharan.org/post/69303442896/the-difference-between-arr-and-arr-how-to-find 를 참조해 주세요.

SO 링크:arr과 arr이 같은 이유는 무엇입니까?

4가 되는 경우0x100 + sizeof x그리고.sizeof x4 *sizeof int= 4 * 4 = 16 = 0x10.

(시스템에서는sizeof int4)입니다.

이를 쉽게 평가할 수 있는 썸룰은 다음과 같습니다.

증분 포인터는 기본 유형의 다음 메모리 위치를 가리킵니다.

여기서 &x의 기본 유형은 int(*p)[4]입니다.이것은 4개의 정수로 이루어진 배열에 대한 포인터입니다.

따라서 이 유형의 다음 포인터는 원래 배열에서 16바이트 떨어진 곳(int가 4바이트라고 가정)을 가리킵니다.

그럼에도 불구하고.x그리고.&x같은 포인터 값으로 평가합니다.이것들은 다른 타입입니다.종류x포인터로 소멸된 후는int*반면 타입은&xint (*)[4].

sizeof(x)sizeof(int)*4.

따라서 이 수치적 차이는&x그리고.&x + 1sizeof(int)*4.

2D 어레이를 사용하여 더 잘 시각화할 수 있습니다.예를 들어 다음과 같습니다.

int array[2][4];

메모리 레이아웃array다음과 같습니다.

array
|
+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+

array[0]        array[1]
|               |
+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+

이러한 배열에 대한 포인터를 사용하면

int (*ptr)[4] = array;

포인터를 통해 메모리를 보면 다음과 같습니다.

ptr             ptr+1
|               |
+---+---+---+---+---+---+---+---+
|   |   |   |   |   |   |   |   |
+---+---+---+---+---+---+---+---+

보시는 바와 같이ptr그리고.ptr+1sizeof(int)*4이 유추는 다음 두 가지 차이점에 적용됩니다.&x그리고.&x + 1당신의 코드로.

믿거나 말거나, 프로그램의 동작은 정의되어 있지 않습니다!

&x + 1@i486의 답변에 따르면 실제로는 어레이 바로 너머를 가리키고 있습니다.당신은 그 기억이 없어요.포인터를 할당하려고 해도 정의되지 않은 동작이며, 참조 해제 시도는 말할 것도 없습니다.

언급URL : https://stackoverflow.com/questions/33775701/different-pointer-arithmetic-results-when-taking-address-of-array

반응형