대상 프로세스 메모리를 수정해야하는 곳에서 programm 작업을하고 있습니다.C - 포인터 산술을 할 때 uintptr_t vs char *로 캐스팅하는 이유
지금까지 내가 adresses를 저장 무효 *를 사용하고 내가 그들을 변경해야하는 경우 사람들은 * 숯불 캐스팅하고 (오프셋 추가하거나 일반적으로 수정)
내가 stdint.h에 정의 된 해당 유형 들었지만 난 더 이상 C89 친숙한 숯불 전환 (이상의 포인터 산술에 대한 사용에 차이가 표시되지 않습니다)
그럼 내 질문 : 그 두 가지 방법 중 포인터 연산에 사용해야합니까? 어쨌든 char * 이상 uintptr_t 사용을 고려해야합니까?
EDIT 1
는 기본적으로 난 그냥는 다음과 같은 가능성이 잘못되었다고 지적한다 ..이 댓글 사용자 R에서
0x00F00BAA hard coded memory adress in target
process
void* x = (void*)0x00F00BAA;
char* y = (void*)0x00F00BAA;
x = (uintptr_t)x + 0x123;
y = (char*)y + 0x123;
x == y?
x == (void*)0x00F00CCD?
y == (void*)0x00F00CCD?
나는 표준이'uintptr_t' 변수의 산술 수정과'char *'에 대한 캐스트가 당신에게'char *'에 수학을 직접 적용하는 것과 같은 결과를 가져 오는 것을 보장하지 않는다고 생각한다. 'uintptr_t'는 유래하지 않았습니다. – PSkocik
@PSkocik 물론 그것은 보유하지 않으며 전혀 미치지 않습니다. –
@AnttiHaapala 만약 uintptr_t를 3으로 움직이면, 대응하는 char *이 3으로 움직일 것으로 기대합니다. 왜 플랫 메모리 모델 플랫폼이 다른 것을하려고하는지 보지 못합니다. – PSkocik