void에서 &&는 무엇을 의미합니까 * p = && abc;
코드 조각을 발견했습니다 void *p = &&abc;
. 여기서의 의미는 무엇입니까 &&
? rvalue 참조에 대해 알고 있지만 &&
이 컨텍스트에서 사용되는 것은 다르다고 생각 합니다. 무엇을 &&
의미 void *p = &&abc;
합니까?
&&
현재 함수에 정의 된 레이블의 주소를 가져 오는 gcc의 확장 입니다.
void *p = &&abc
표준 C99 및 C ++에서는 불법입니다.
이것은 g ++로 컴파일됩니다.
그것을 찾는 방법
이것이 라벨의 주소이며 GCC와 관련된 기능 입니다.
int main(void) {
void* startp;
s:
startp = &&s;
printf("the assignment above starts at address %p\n", startp);
return 0;
}
테스트를 통해 직접 알아낼 수 있습니다.
int main(void) {
void* startp;
int a;
startp = &&a;
printf("startp=%p\n", startp);
return 0;
}
이 경우 GCC는 다음과 같이 말합니다.
오류 : 레이블 'a'가 사용되었지만 정의되지 않았습니다.
후드 아래-조립
이것을 이해하기 위해서는 어셈블러를 알아야하지만 레이블 주소가 무엇을 의미하는지 설명하려고합니다.
OS가 디스크에서 .exe 파일을로드 한 후 "로더"라는 운영 체제의 구성 요소 (윈도우에는 "PE 로더"가 있고, Linux에는 "ELF 로더"가 있습니다. 커널), 해당 프로그램의 "가상화"를 수행하여 프로세스로 전환합니다.
이 프로세스는 이것이 RAM에서 유일한 것으로 간주하고 전체 RAM (즉, 32 비트 시스템에서 0x00000000-0xFFFFFFFF)에 액세스 할 수 있습니다.
(위는 무슨 일이 일어나고 있는지에 대한 짧은 오버 와이트입니다. 당신은 그것을 완전히 이해하기 위해 정말로 어셈블리를 배워야합니다.
이제 소스 코드의 레이블은 기본적으로 주소입니다. "고토 레이블;" 해당 주소로 점프하는 것 외에는 아무것도하지 않습니다 ( 어셈블리 의 명령어 포인터 에 대해 생각해보십시오 ). 이 레이블은이 RAM 주소를 저장하며, 그 주소를 찾을 수있는 방법입니다.
ASM을 배운 후에는 해당 주소 .text
가 실행 파일 섹션 내의 명령어를 가리킴을 알게 될 것 입니다. .text
섹션으로 실행될 프로그램 (이진) 코드를 보유하고있는 것입니다.
다음을 사용하여이를 검사 할 수 있습니다.
objdump -x a.out
실용적인 예
GCC에 설명 된대로 이를 사용하여 점프 테이블을 초기화 할 수 있습니다. re2c ( 매개 변수 참조) 와 같은 일부 스캐너 생성기 는 이를 사용하여보다 컴팩트 한 스캐너를 생성합니다. 동일한 기술을 사용 하는 파서 생성기 가있을 수도 있습니다 .-g
참고 URL : https://stackoverflow.com/questions/6106493/what-does-mean-in-void-p-abc
'Programing' 카테고리의 다른 글
JSTL과 함께 EL을 사용하여 Enum 값에 액세스 (0) | 2020.08.16 |
---|---|
화면 회전 후 TextView 상태 복원? (0) | 2020.08.16 |
Git 브랜치를 닫는 방법? (0) | 2020.08.16 |
문자열에 숫자 만 포함되어 있는지 파이썬에서 어떻게 확인합니까? (0) | 2020.08.16 |
C #에 단 수화-단어를 복수화하는 알고리즘이 있습니까? (0) | 2020.08.16 |