*(uint32_t*) 식을 이해하지 못함
나는 그 표현이 무엇인지 이해하지 못하고 있습니다.*(uint32_t*)
그렇습니다.
저는 각 부분이 무엇을 하는지 해석할 수 있도록 각 부분을 선언하는 예로 설명했습니다.
uint32_t* ptr;
uint32_t num
*(uint32_t*)(ptr + num); // <-- what does this do?
예제의 마지막 부분을 이해할 수 없습니다. 표현식이 다음과 같을 때 발생하는 현상입니다.*(uint32_t*)(ptr + num);
런타임 중에 실행하시겠습니까?
uint32_t
는 32비트를 보장하는 숫자 유형입니다.값은 부호가 없습니다. 즉, 값의 범위가 0에서32 2 - 1 사이가 됩니다.
이것.
uint32_t* ptr;
형식을 합니다.uint32_t*
그러나 포인터가 초기화되지 않았습니다. 즉, 포인터가 특정 위치를 가리키지 않습니다.해당 포인터를 통해 메모리에 액세스하려고 하면 정의되지 않은 동작이 발생하고 프로그램이 중단될 수 있습니다.
이것.
uint32_t num;
입니다.uint32_t
.
이것.
*(uint32_t*)(ptr + num);
ptr + num
새 포인터를 반환합니다.이것을 포인터 산술이라고 합니다.컴파일러가 유형의 크기를 고려하는 것은 일반적인 산술과 같습니다.을 생각하다ptr + num
원본에 기반한 메모리 주소로ptr
+ 인터더 수트바의 수num
uint32_t
물건들.
그(uint32_t*) x
에게 이은컴파에표게현말처한합다다니고리야해라는 을 다루어야 .x
마치그럼인 양uint32_t*
이 경우에는, 필요하지도 않습니다, 왜냐하면ptr + num
이미 입다입니다.uint32_t*
.
그*
처음에는 포인터를 통해 메모리에 액세스하는 데 사용되는 참조 해제 연산자입니다.전체 표현식은 다음과 같습니다.
ptr[num];
이러한 변수는 모두 초기화되지 않기 때문에 결과는 가비지가 됩니다.
그러나 이렇게 초기화하면 다음과 같습니다.
uint32_t arr[] = { 1, 3, 5, 7, 9 };
uint32_t *ptr = arr;
uint32_t num = 2;
printf("%u\n", *(ptr + num));
5를 입니다, 이은를 5인할 것다이면, 하왜냐것쇄.ptr[2]
5입니다.
uint32_t
에 정의되어 있습니다.stdint.h
그래서 그것을 포함해야 할 수도 있습니다.
#include <stdint.h>
이 헤더는 정확히 32비트를 취하는 부호 없는 정수 유형으로 정의되어야 합니다.
이것은 실제로 아무 것도 하지 않습니다.다른 예를 들어 보겠습니다.
uint32_t data;
void *pointer = &data;
*(uint32_t *)pointer = 5;
은일단.void*
"슬립" 포인터를 의미합니다.모든 유형의 개체를 가리킬 수 있습니다.
지금이다,(uint32_t *)
" " 혜적입 " 니다interpret "라는 뜻입니다.pointer
이 유이있개는대포로인터한체에형▁a▁uint32_t
.
나머지 표현식은 단순히 "이 포인터가 저장한 위치에 5 저장"을 의미합니다.
이 무엇을 알고 ,uint32_t
즉, 정확히 32비트의 부호 없는 정수입니다.그리고.pointer + num
같와다니습소의 주소와 .pointer[5]
.
이러한 유형의 표현은 일반적으로 유형 펀닝에서 사용됩니다.만약 당신이 타입 펀닝에 익숙하지 않다면, 주요 아이디어는 타입 시스템을 우회하여 당신이 어떤 것을 실제와 다른 타입으로 취급할 수 있도록 하는 것입니다(즉, 내장을 이중으로 취급).
유형 펀닝의 주요 아이디어는 현재 변수에 대한 포인터를 가져온 다음 해당 유형의 포인터에 캐스팅한 다음 참조를 해제하여 다른 유형으로 펀닝하는 것입니다. 따라서 일반적으로 사용되는 캐스트와 참조 해제는 다음과 같습니다.*(uint32_t *)
부호 없는 32비트 int 포인터로 캐스팅한 다음 참조 취소).
다른 사람들이 지적했듯이, 당신의 코드는 당신이 int에 대해 punning을 하고 있기 때문에 "아무것도 하지 않습니다", 그것은 아무 영향도 주지 않습니다.하지만 만약 당신이 핀트를 더블로 만들고 싶었다면...
uint32_t num=5;
double& myvar=*(double*) #
이제 당신은 조작할 수 있습니다.num
더블비아로서의 s 메모리myvar
그럼에도 불구하고.num
여전히 인트입니다.이것은 끔찍한 생각이고 단지 펀닝의 사용에 대한 장난감 예시로 의도된 것입니다.
언급URL : https://stackoverflow.com/questions/48833976/failing-to-understand-what-the-expression-uint32-t-does
'programing' 카테고리의 다른 글
Python Regex가 그룹을 즉시 대체 (0) | 2023.06.11 |
---|---|
변수를 사용하여 data.table에 열 이름 전달 (0) | 2023.06.11 |
문자열을 16진수 바이트로 인쇄 (0) | 2023.06.11 |
DateTimeFormat 옵션을 가져오는 방법 (0) | 2023.06.11 |
Oracle에서 임시 테이블과 글로벌 임시 테이블의 차이점은 무엇입니까? (0) | 2023.06.11 |