2014-11-30 3 views
0

나는 fallowing 구조체가 :구조체 내의 통합. 컴파일 경고. C

struct lshort_sched_param { 
    int requested_time; 
    int level; 
}; 

struct sched_param { 
    union { 
     int sched_priority; 
     struct lshort_sched_param lshort_params; 
    }; 
}; 

을 그리고 난 그렇게처럼의 새 인스턴스를 만들려고 해요 : 일부 경고

struct lshort_sched_param *l = {2 ,1}; 
struct sched_param *p = {3, l}; 

를 얻을 :

test.c:5: warning: initialization makes pointer from integer without a cast 
test.c:5: warning: excess elements in scalar initializer 
test.c:5: warning: (near initialization for `l') 
test.c:6: warning: initialization makes pointer from integer without a cast 
test.c:6: warning: excess elements in scalar initializer 
test.c:6: warning: (near initialization for `p') 

을 아무도 내게 그것을 도울 수 있습니까?

+0

코드에 여러 가지 문제가 있습니다. 왜 포인터를 선언하고 마치'struct'처럼 초기화합니까? – fuz

+0

* anonymous * union을 선언했음을 주목하십시오. 식별자를 선언하면 어떨까요? 'union {...} foo;와 같이. – Jens

답변

0

당신은 포인터를 선언하고 있지만, 포인터가 가리키는 것을 수정하기 전에 뭔가를 지적해야하며, 이런 식으로 malloc을 사용하여 끝낼 수 있습니다.

struct lshort_sched_param *l = NULL; 
l = malloc(sizeof(struct lshort_sched_param)); 

struct sched_param *p = NULL; 
p = malloc(sizeof(struct sched_param)); 

우리는 무엇을하고 있습니까?. 음, malloc은 메모리에 몇 바이트를 할당하고 블록의 시작 부분에 포인터를 반환합니다. 우리의 경우 우리는 malloc에 ​​의해 반환 된 포인터를 포인터 l과 p에 할당합니다. 결과는 l과 p가 우리가 방금 만든 구조.

그러면 p와 l이 가리키는 구조의 값을 이와 같이 변경할 수 있습니다.

l->requested_time = 2; 
l->level = 1; 
p->sched_priority = 3; 
p->lshort_params.requested_time = 1; 
p->lshort_params.level = 1; 

편집 : 분명히

, 당신은 또한이 작업을 수행 할 수 있습니다.

struct lshort_sched_param p = {2, 1}; 

그리고 나서.

struct lshort_sched_param *ptr = &p; 

하지만 할 때.

struct lshort_sched_param *l; 

변수를 입력 할 때까지 포인터 만 선언하면 아무 것도 가리 키지 않습니다.

0

나는 다음과 같은 싶었던 생각 :

struct lshort_sched_param { 
    int requested_time; 
    int level; 
}; 

union sched_param { 
    int sched_priority; 
    struct lshort_sched_param lshort_params; 
}; 

는 다음을 수행 구조체/노동 조합에 대한 메모리를 할당하려면

struct lshort_sched_param l = {2 ,1}; 
union sched_param p; 
// init 
// either this 
p.sched_priority = 3; 
// or that 
p.lshort_params = l; 

귀하의 라인 struct sched_param *p = {3, l};이 이해가되지 않습니다.

3

이 허용되지 않는다 :

struct lshort_sched_param *l = {2 ,1}; 

브레이스 둘러싸인 초기화리스트를 하나 개 이상의 원소 만 struct 또는 배열되지 포인터를 초기화 할 수있다.

당신은 쓸 수 :

struct lshort_sched_param m = { 2, 1 }; 
struct lshort_sched_param *ptr_m = &m;  // optional 

는 또한 m의 저장 기간에 대해 생각해야합니다. (NB. l 대신에 m을 변수 이름으로 사용했습니다. 후자는 많은 글꼴에서 1처럼 보입니다.

struct lshort_sched_param *ptr_m = (struct lshort_sched_param) { 2, 1 }; 

이 경우에 해당 ptr_m 점에 개체를 수정할 수 있습니다 :

또 다른 가능성이다. 이것은 복합 문자 리터럴이라고합니다. ptr_m 경우 자동 저장 기간 ("스택에")이 있습니다. 그렇지 않으면 정적 저장 기간이 있습니다.


그러나 상황은 struct sched_param *p = {3, l};으로 악화됩니다. 다시, 이니셜 라이저는 포인터를 초기화 할 수 없습니다.

또한 유니온 이니셜 라이저에는 하나의 요소 만있을 수 있습니다. 하나 이상의 조합원을 시도하고 초기화하는 것은 허용되지 않습니다. 어쨌든 말이 안되네. (아마도 당신은 노동 조합이 어떻게 작동하는지 오해 할 것입니다).

다른 가능한 문제는 파일 범위의 이니셜 라이저가 상수식이어야한다는 것입니다.

+0

좀 더 나은 조언을 얻기 위해 더 많은 컨텍스트를 게시하십시오. 이것은 함수 또는 전역에 있습니까? 그리고이 노조로 무엇을하려고 했습니까? –