다음 코드가 어떻게 작동하는지 잘 모르겠습니다.
int p = 0;
char* arr = new char[20];
*((int*)&arr[p]) = *((unsigned int*)"ABCD");
내 관찰은 다음과 같습니다.
arr[p] returns a char
&arr[p] gets the address of the char (char*)
(int*)&arr[p] casts the char* to int*
*((int*)&arr[p]) dereferences the int* to int
"ABCD" is a char*
(unsigned int*)"ABCD" casts the char* to unsigned int*
*(unsigned int*)"ABCD" dereferences the unsigned int* to unsigned int
그런 다음 "ABCD"의 첫 번째 문자 'A'(부호없는 정수로 해석)를 arr의 첫 번째 요소 (int로 해석)로 복사합니다. 그러나 검사시 arr 'A'의 첫 번째 요소 일뿐만 아니라 두 번째, 세 번째 및 네 번째 요소는 각각 'B', 'C'및 'D'입니다.
내 질문은 "ABCD"의 첫 번째 문자 'A'만 arr의 첫 번째 요소에 복사 한 경우 다른 문자 'B', 'C'및 'D'도 어떻게 복사됩니까?
감사합니다
귀하의 관찰은 완벽하게 정확하지만 오른쪽의 역 참조와 할당의 의미를 잘못 이해하는 것 같습니다.
하나 char
를으로 복사 (및 변환)하지 unsigned int
않지만 sizeof(unsigned int)
한 주소에서 다른 주소로 바이트 를 효과적으로 복사 합니다.
이것이 c 스타일 캐스트가 그렇게 위험한 이유 중 하나입니다. (1) : char를 unsigned int로 캐스팅하고 할당하지 않고 char에 대한 포인터 를 포인터 로 캐스팅 한 다음 역 참조합니다. 우측 역 참조 때, 컴파일러는 단지 4 바이트 (있다고 가정 지정된 어드레스에서 시작하는)의를 포함 하고에서만 전환을 수행 하는 .unsigned int
sizeof(unsigned int)
unsigned int
unsigned int
int
분명히하고 싶었던 것은 다음과 같습니다.
*((int*)&arr[p]) = unsigned int("ABCD"[0]);
그러나 MM이 지적했듯이 왼쪽은 어쨌든 UB입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다