2016-09-19 7 views
9

와 나는 구조체가 : 지금은 변수 My_TYPE*을 포인터를 만들 필요가 있고 난 단지 원하는,초기화 구조체 하나의 필드

MY_TYPE a = { .flag = true, .value = 123, .stuff = 0.456 }; 

그러나 : 나는하여 초기화하기 수있어

struct MY_TYPE { 
     boolean flag; 
     short int value; 
     double stuff; 
    }; 

을 거기에 하나의 필드를 초기화 하시겠습니까? 나는 예컨대 :

MY_TYPE *a = {.value = 123}; 

을 시도하지만 컴파일러 오류 "Designator in intializer for scalar type 'struct MY_TYPE *'"를 얻을.

하나의 필드로 구조체를 초기화 할 수 있습니까?

+7

오류는 한 필드와 아무 관련이 없습니다. 'struct initializer'로 포인터를 초기화 할 수 없습니다. – 2501

+0

그래서, 내 목표를 달성하는 것이 불가능하거나 내 목표를 달성하기위한 다른 방법이 있다는 것을 의미합니까? –

+0

불가능하지만 구문 상 매우 유사한 몇 가지 방법이 아래 답변에 나와 있습니다. – 2501

답변

15

우선, struct MY_TYPE과 typedef를 혼합합니다. 게시 된 코드는 그 이유 때문에 작동하지 않습니다. 당신이 찾고있는 무엇을 달성하기 위해 당신은 다음, 화합물 문자에 대한 포인터를 사용할 수 있습니다

typedef struct 
{ 
    bool flag; 
    short int value; 
    double stuff; 
} MY_TYPE; 

: 당신은 다음과 같이해야 할 것이다

MY_TYPE* ptr = &(MY_TYPE){ .flag = true, .value = 123, .stuff = 0.456 }; 

그러나 화합물이 점에 유의하시기 바랍니다 리터럴에는 로컬 범위가 있습니다. 이러한 데이터를 로컬 범위의 끝을 지나서 사용하려면 정적 또는 동적으로 할당 된 변수에 대한 포인터를 사용해야합니다.

4

구조체의 실제 인스턴스를 처음 만들면 원하는대로 초기화 한 다음 포인터가이를 가리킬 수 있습니다.

예.

struct MY_TYPE a = {.value = 123}; 
struct MY_TYPE *p = &a; 

구조체를 동적으로 할당하려는 경우에는 불가능합니다. 그런 다음 두 단계로 수행해야합니다. 초기화 다음 :

struct MY_TYPE *p = calloc(1, sizeof *p); 
p->value = 123; 

는 초기화와는 아무 상관 얻을 수 있지만, 포인터 아닌 뭔가 포인터를 초기화하려고하는 오류입니다.

5

compound literals을 사용할 수 있습니다.

#include <stdio.h> 
#include <stdbool.h> 

struct MY_TYPE 
{ 
    bool flag; 
    short int value; 
    double stuff; 
}; 

int main(void) 
{ 
    struct MY_TYPE *a = &(struct MY_TYPE){.value = 123}; 

    printf("%d\n", a->value); 
}