programing

C는 (...)의 크기와 ...의 크기를 올바르게 처리합니까?이 경우에는?

muds 2023. 9. 8. 21:46
반응형

C는 (...)의 크기와 ...의 크기를 올바르게 처리합니까?이 경우에는?

다음 코드에서 기능은test그리고.test2동등한?

typedef int rofl;

void test(void) {
    rofl * rofl = malloc(sizeof(rofl)); // Is the final rofl here the TYPE?
}

void test2(void) {
    rofl * rofl = malloc(sizeof *rofl); // Is the final rofl here the VARIABLE?
}

즉,

  1. 한다rofl인에sizeof(rofl)정확하게 고릅니다.rofl 괄호 때문에 타자를 치나요?
  2. 한다rofl인에sizeof *rofl정확하게 고릅니다.rofl 괄호가 부족해서 변수가 생긴 건가요?

참고: 이것은 우습게 보이는 예이지만 실제로 변수 이름과 동일한 유형의 이름이 있을 수 있습니다.그래서 질문입니다.

두 경우 모두 마지막은rofl는 변수 이름입니다.변수 이름은 나타나는 즉시 범위에 포함되며, 현재 범위의 나머지는 일반적인 컨텍스트(*)에 있는 식별자가 항상 변수 이름을 의미합니다.

sizeof연산자는 이름 찾기에 대한 특별한 경우를 소개하지 않습니다.사실, 식별자의 숨겨진 의미를 사용할 언어 구성 요소는 없습니다.

실제로는 유형과 변수 이름에 동일한 식별자를 사용하지 않는 것이 좋습니다.


(*) 식별자에는 레이블 이름, 구조물 태그 및 구조물 구성원의 세 가지 특수 컨텍스트가 있습니다.그러나 다른 모든 컨텍스트에서 모든 식별자는 동일한 이름 공간을 공유합니다. 유형 이름 대 변수 이름 대 함수 이름 등에 대한 고유한 식별자 이름 공간이 없습니다.

다음은 작위적인 예입니다.

typedef int A;      // "A" declared as ordinary identifier, meaning a type name

struct A { A A; };  // "A" declared as struct tag and member name -- OK as these are three different name spaces. Member type is "int"

A main()            // int main() - ordinary context
{
    struct A A();   // "A" declared as ordinary identifier, meaning a function name; hides line 1's A
    // A C;         // Would be error: ordinary A is a function now, not a typedef for int
    struct A B;     // OK, struct tags have separate name space
    A:+A().A;       // OK, labels and struct members have separate name space, calls function
    goto A;         // OK, label name space
}

이 선언문에서

rofl * rofl = malloc(sizeof(rofl)); // Is the final rofl here the TYPE?

변수의 이름rofltypedef 이름을 숨깁니다.rofl. 따라서 연산자의 크기에서 포인터가 사용됩니다.rofl그것은 그 표현이 유형을 가지고 있다는 것입니다.int *.

이 선언에도 동일하게 적용됩니다.

rofl * rofl = malloc(sizeof *rofl); 

참조된 포인터를 사용한 표현이 있다는 것을 제외하고는rofl유형 디에프 이름의 유형을 가지고 있는rofl그것이 타입입니다.int.

이 C 문법 정의 때문에 혼란이 생기는 것 같습니다.

sizeof unary-expression
sizeof ( type-name )

하지만unary-expression괄호 안에 포함된 표현식인 주 표현식이 될 수 있습니다.

C 표준(6.5.1 주 표현식)으로부터

primary-expression:
    ( expression )
    //...

예를 들어 만약x는 변수의 이름이며 다음 중 하나를 쓸 수 있습니다.

sizeof x 

아니면

sizeof( x )

명확하게 하기 위해 연산자의 크기와 기본 식 사이에 빈칸을 삽입할 수 있습니다.

sizeof    ( x )
operator  primary expression

비교를 위해 또 다른 단항 연산자인 단항 연산자를 생각해 보십시오.예를 들어 글을 쓸 수 있습니다.

+ x

아니면

+ ( x )

이제 단항 플러스를 다른 단항 연산자로 대체합니다.sizeof.

이름 숨기기의 경우 이름에 태그의 키워드가 포함되어 있기 때문에 구조물, 조합 및 열거형에 대해 문제를 해결할 수 있습니다.

예를들면

typedef struct rofl { int x; } rofl;

void test(void) {
    rofl * rofl = malloc(sizeof( struct rofl));
}

이 의 에는 된 이 이 의 된 struct rofl.

이 기능을 사용하는 동안

typedef struct rofl { int x; } rofl;

void test(void) {
    rofl * rofl = malloc(sizeof( rofl));
}

의 와 와 이 됩니다 됩니다 이 의 와 와 roflstruct rofl *.

"선택"이나 "선택"은 관련되어 있지 않습니다. 모두두우두두n.rofl각된된h에서 sizeof범위 지정 규칙으로 인해 호출은 유형이 아닌 변수입니다.변수는 내부 범위에서 선언되므로 유형 이름을 재정의합니다.한의호기e호에 대한 인수의 괄호.sizeof연산자는 무관합니다.

행운을 빌어요.

언급URL : https://stackoverflow.com/questions/47297871/does-c-correctly-handle-sizeof-and-sizeof-in-this-case

반응형