보이드의 크기는 얼마입니까?
이 진술은 무엇을 산출할 것인가?
void *p = malloc(sizeof(void));
편집: 질문의 확장입니다.
sizeof(void)가 GCC 컴파일러에서 1을 산출하면 1바이트의 메모리가 할당되고 포인터 p가 해당 바이트를 가리키며 p++는 0x2346으로 증가합니까?p가 0x2345라고 가정합니다.나는 p를 말하는 것이지 *p를 말하는 것이 아니다.
" " "void
사이즈가 없습니다.컴파일 오류일 수 있습니다.같은 이유로 다음과 같은 작업을 수행할 수 없습니다.
void n;
집집을 하고 요. ★★★★★★★★★★★★★★★★★★,sizeof(void)
는 실제로 GNU C로 컴파일합니다.
$ echo 'int main() { printf("%d", sizeof(void)); }' | gcc -xc -w - && ./a.out
1
단, C++에서는 다음 기능이 없습니다.
$ echo 'int main() { printf("%d", sizeof(void)); }' | gcc -xc++ -w - && ./a.out
<stdin>: In function 'int main()':
<stdin>:1: error: invalid application of 'sizeof' to a void type
<stdin>:1: error: 'printf' was not declared in this scope
의 확장을 삭제하는 , 는 를 사용합니다.sizeof(void)
는 1. GCC에는 이를 실현하는 비표준 확장자가 있습니다.
으로는, 「 」입니다.void
는 불완전한 유형이며 불완전한 유형에는 size of를 사용할 수 없습니다.
일일 ~일도 although although although although 。void
타입에 대해 제자리걸음을 할 수 있지만 실제로는 값을 유지할 수 없습니다.따라서 메모리 크기가 없습니다.「 」의 void
정의되어 있지 않습니다.
A void
포인터는 단순히 언타이프 메모리에 대한 포인터를 의미하는 언어 구성입니다.
void
사이즈가 없습니다. 와 의 에서, C' C++ 의 .sizeof (void)
효입니니다다
C에서 N1570 6.5.3.4 단락 1의 인용:
연산자는 함수 유형 또는 불완전한 유형을 가진 표현식, 괄호 안에 있는 형식의 이름 또는 비트 필드 부재를 지정하는 표현식에 적용해서는 안 된다.
(N1570은 2011년 ISO C 표준의 초안입니다).
void
는 불완전한 유형입니다.이 단락은 제약사항입니다.즉, C 컴파일러에 준거한 모든 위반을 진단해야 합니다.(진단 메시지는 치명적이지 않은 경고일 수 있습니다.)
C++ 11 규 c c c c c c c c c 。두 판 모두 이 질문 후에 발행되었지만 규칙은 1989년 ANSI C 표준과 최초의 C++ 표준으로 거슬러 올라간다.이 은요, 이 룰은void
으로, 에 됩니다.sizeof
할 수 은 「적용되지 않을 수도 있다」의 올라간다.void
언어로 변환합니다.
gcc에는 다음 명령어를 처리하는 확장자가 있습니다.sizeof (void)
1. C 에서는 1.gcc C에 대해 sizeof (void)
이와 같은 확장 기능은 C 컴파일러에 완전히 적합한 경우에도 허용되지만 진단은 여전히 필요합니다.
보이드의 크기를 취하는 것은 GCC 확장입니다.
sizeof()
불완전한 유형에는 적용할 수 없습니다.그리고.void
완료할 수 없는 불완전한 유형입니다.
주식회사,sizeof(void) == 1
컴파일러에 따라 다를 수 있습니다.
C++에서는, 다음과 같이 됩니다.
'int main()' 함수의 경우: 라인 2: 오류: 보이드 유형에 'size of'이 잘못 적용되었습니다.-Wfatal-errors로 인해 컴파일이 종료되었습니다.
질문의 두 번째 부분:sizeof(size of)(size *!)= size of(size of)(size of(size of)(32비트 아치에서는 sizeof(void *)는 4바이트이므로 p++가 그에 따라 설정됩니다.포인터가 증가하는 양은 포인터가 가리키는 데이터에 따라 달라집니다.그래서 1바이트씩 늘어나게 됩니다.
대부분의 C++ 컴파일러는 컴파일 에러를 발생시키도록 설정되어 있습니다.sizeof(void)
.
C를 컴파일 할 때 gcc가 적합하지 않기 때문에sizeof(void)
1. 이상하게 보일 수도 있지만 근거가 있습니다.포인터 산술을 수행할 때 단위 하나를 추가하거나 제거하는 것은 크기를 가리키는 개체를 추가하거나 제거하는 것을 의미합니다.이렇게 정의한다.sizeof(void)
1은 정의에 도움이 됩니다.void*
바이트에 대한 포인터(유형 메모리주소)로 지정합니다.그렇지 않으면 다음과 같은 포인터 산수를 사용하여 놀라운 동작을 하게 됩니다.p+1 == p when
는 p420입니다.void*
은 c할 수 , cccvoid를 할 때는
권장되는 표준 방법은 다음과 같습니다.char*
이데올로기 때문에
sizeof를 사용할 때 C와 C++의 또 다른 유사한 차이는 다음과 같은 빈 구조를 정의했을 때 발생합니다.
struct Empty {
} empty;
컴파일러 사용 Csizeof(empty)
는 00을 반환합니다.를가 1.g++ 로 됩니다.
이 점에 있어서 C와 C++ 규격의 양쪽 모두 어떤 상태인지는 알 수 없지만, 일부 빈 구조/개체의 크기를 정의하면 서로 다른 연속 객체에 대한 두 개의 참조(첫 번째 개체는 비어 있음)가 동일한 주소를 얻는 것을 피하기 위해 참조 관리에 도움이 된다고 생각합니다.참조가 숨겨진 포인터를 사용해 실장되어 있는 경우는, 다른 주소를 확인하는 것이, 그것들을 비교하는 데 도움이 됩니다.
그러나 이는 다른 것을 도입함으로써(빈 객체, 심지어 POD도 최소 1바이트의 메모리를 소비함) 놀라운 동작(참조 내용의 구석기 비교)을 피하기 위한 것일 뿐입니다.
크기(숫자) 자체는 의미가 없을 수 있지만 포인터 계산을 할 때는 중요합니다.
예:
void *p;
while(...)
p++;
size of(void)가 1로 간주되면 이 방법이 작동합니다.sizeof(void)가 0으로 간주되면 무한 루프가 발생합니다.
언급URL : https://stackoverflow.com/questions/1666224/what-is-the-size-of-void
'IT이야기' 카테고리의 다른 글
nexttick 후에도 vue가 데이터를 업데이트하지 않는 이유는 무엇입니까? (0) | 2022.06.12 |
---|---|
Vue Full Calendar의 다음 달 및 이전 달 감시자 (0) | 2022.06.12 |
Java에서 지정된 문자열이 유효한 JSON인지 확인하는 방법 (0) | 2022.06.12 |
동시에 2개의 다른 요소에 대한 전이 페이드인 및 페이드아웃 (0) | 2022.06.12 |
최소/최대 검증 - Vuetify (0) | 2022.06.12 |