IT이야기

보이드의 크기는 얼마입니까?

cyworld 2022. 6. 12. 12:12
반응형

보이드의 크기는 얼마입니까?

이 진술은 무엇을 산출할 것인가?

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

반응형