문자 포인터가 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입니다.int
4 입니다.이 은 this, 가, 가, 가, 추, 추, 추, 추, 추, 를 더하면4
로로 합니다.ptr
는, 의 .int
manager.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
입니다.char
를 ptr
ptr의 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
'programing' 카테고리의 다른 글
vuex에서 반응하지 않는 getter (0) | 2022.08.29 |
---|---|
플렉스-컬럼을 사용하여 다른 항목을 고정하는 동안 하나의 플렉스박스 항목만 스크롤 (0) | 2022.08.29 |
Java에서 시프트 연산자는 어떻게 작동합니까? (0) | 2022.08.29 |
매퍼를 사용한 양방향 바인딩 계산 속성 (0) | 2022.08.28 |
여러 Vue 애플리케이션, 단일 구성 요소 공유 (0) | 2022.08.28 |