programing

문자 포인터가 int*에서 캐스트된 후 유효하지 않은 값을 가리키고 있습니다.

goodsources 2022. 8. 29. 22:25
반응형

문자 포인터가 int*에서 캐스트된 후 유효하지 않은 값을 가리키고 있습니다.

저는 C 프로그래밍 언어를 배우고 있으며, 포인터로 배열을 배우기 시작했습니다.이 질문에는 문제가 있습니다만, 그 출력은 「누구라도 이유를 설명해 주실 수 있습니까?」라고 하는 것이었으면 합니다.

int main(){
   int arr[] = {1, 2, 3, 4, 5};
   char *ptr = (char *) arr;
   printf("%d", *(ptr+4));
   return 0;
}

하여 int 32비트(4바이트)의 개별 를 endian으로 합니다.int arr[]다음과 같습니다(낮은 주소의 최하위 바이트).(16) :

|01 00 00 00|02 00 00 00|03 00 00 00|04 00 00 00|05 00 00 00
char *ptr = (char *) arr;

그럼 이제 ㅇㅇㅇㄹㄹㄹㄹ,ptr바이트를 - - eded - - - - - - - - - -eded points points points points points points points points points points points points points points로 캐스트했으므로char* 배열이후로는 char

|1|0|0|0|2|0|0|0|3|0|0|0|4|0|0|0|5|0|0|0
 ^
 +-- ptr

ㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇㅇ는,*(ptr+4)하는 char를 합니다.char 추가:

|1|0|0|0|2|0|0|0|3|0|0|0|4|0|0|0|5|0|0|0
         ^
         +-- *(ptr + 4) = 2

때문에, 「 」는,printf()2.

Big Endian 시스템에서는 각 바이트의 순서int되어 있다

|0|0|0|1|0|0|0|2|0|0|0|3|0|0|0|4|0|0|0|5
         ^
         +-- *(ptr + 4) = 0

그 이유는 의 크기가char는 1입니다.int4 입니다. this, 가, 가, 가, 추, 추, 추, 추, 추, 를 더하면4로로 합니다.ptr는, 의 .intmanager.manager로 하다

이것을 엔디안 시스템으로 컴파일 했을 경우는, 대신에 33554432 를 인쇄했을 것입니다.

int main(){
 int arr[] = {1,2,3,4,5};
 char *ptr = (char *) arr;
 printf("%d",*(ptr+4));
 return 0;
}

의 각 arr 있다sizeof(int)4번으로 나누다

★★ptr는 포인터입니다.char, 포인터 산술 작성ptr + 4는 '4' 뒤에 있습니다.&arr[0]은)일 수도 있어요.&arr[1].

메모리에서는 다음과 같이 보입니다.

Address | 0 1 2 3 | 4 5 6 7 | ...
Value   |  arr[0] |  arr[1] | ...

당신이 하는 일은 프로덕션 코드에서는 절대 권장되지 않지만, 학습 과정에서 포인터, 캐스팅 등을 이해하는 데 매우 좋기 때문에, 이 예에 매우 적합합니다.점점점 2시?따라 크기가 때문입니다(이 경우 int의 크기가 다릅니다).sizeof(int)합니다.ptr포인터로서 char.char는 1바이트입니다.)ptr+4는 포인터가).는 포인터가 참조하는 오브젝트의 사이즈에 대응합니다(문자 포함의 경우). ★★★★★★★★★★★★★★★★★▼ptr+4 있기 에, 「4」의.int배열. 그게 다야.★★를 해 보세요.ptr+5 00이 나올

에서는 32비트int입니다.charptrptr의 4배의 크기를 ptr에 추가합니다(그 자체가 메모리 위치입니다).이 주소는 우연히도 네트워크 내의 두 번째 요소의 주소입니다.int어레이를 설정합니다.

64비트 플랫폼에서는int의 8배 크기입니다.char출력은 매우 다릅니다.

한마디로 말하면, 당신의 코드는 휴대할 수 없지만(요아힘 필레보그의 대답도 참조) 언팩은 재미있습니다.

int*부터 char*까지를 커버하고 있으므로 ptr[0] = 1, ptr[4] = 2, ptr[8] = 3, ptr[12] = 4, ptr[16] = 5 및 기타 모든 것과 동일한 ptr+4 요소는 ptr 배열의 4번째 요소를 가리킵니다.결과는 2입니다.

int main(){
 int arr[] = {1,2,3,4,5};
 char *ptr = (char *) arr;
 printf("%d",*(ptr+4));
 return 0;
}

상상하다arr주소에 저장되어 있습니다.100(비동기 주소).다음과 같은 것이 있습니다.arr[0]는 주소 100 에 저장됩니다. arr[1]주소 104에 저장되어 있습니다.(유형상 +4가 있습니다).int)arr[2]는 주소 108에 저장됩니다. arr[3]주소 112에 저장됩니다.기타 등

이제 너는 하고 있다char *ptr = (char *) arr;,그렇게ptr (= 100 ()과 )arr특히 두 번째 인수는printf*(ptr+4)라는 것을 .라는 것을 명심해 주세요.ptr 그러니까 100. 그래서ptr + 4, = , 같은 주소arr[1]! 의 됩니다.arr[1] 2번, 2번, 2번

언급URL : https://stackoverflow.com/questions/17423967/my-char-pointer-points-to-invalid-value-after-being-cast-from-int

반응형