2011-11-07 7 views
1

typedef struct에 비슷한 구조의 다른 배열 struct을 어떻게 할당합니까?typedef 구조체에 구조체 배열 할당

#include <stdio.h> 
#include <stdlib.h> 

typedef struct { 
    int age; 
    int height; 
} Person[3]; 

struct internalStruct { 
    int age; 
    int height; 
}; 

int main(void) { 

    //Possible 
    Person bob = {{7,5},{4,2},{4,3}}; 

    //Is it possible to assign array to struct? 
    struct internalStruct intr[3] = {{4,32},{2,4},{2,4}}; 
    Person job = intr; // Does not work :(. 
    printf("%d", jon[0].height); 
    return 0; 
} 
+0

'struct internalStruct {int age; int 고도; }; typedef struct internalStruct Person [3];'? –

+0

그냥 메모리 구조를 동일한 경우 (3 배열의 typedef 같은 구조를 잘 구조체 3 일반 배열입니다 이해하려고 노력하고 있어요. 난 실제로 C에서 코딩 오전 오전. – Anonymous

답변

4

하지만 배열 표현식은 할당 연산자의 왼쪽에 나타날 수 없습니다 : 그렇다면, 당신은 memcpy()로 복사 할 수 있습니다.

배열 객체의 값을 다른 배열 객체로 복사하려면 명시 적 루프를 사용하여 각 요소를 할당하거나 (요소 유형이 할당 가능하다고 가정) memcpy()을 사용할 수 있습니다. (memcpy()를 호출 복사 바이트의 수를 지정할 필요가 있습니다,이에 대한 sizeof를 사용합니다.)

그리고 당신의 타입 정의 Person을 :

typedef struct { 
    int age; 
    int height; 
} Person[3]; 

는 경솔한입니다. Person 개체 (변수)는 사람이 아닙니다. 그것은 3 인 (사람들?)의 배열입니다.

내 조언 다음 형식 정의를 삭제 단지 구조체 태그를 사용하여 (이미 struct internalStruct을 위해 할로) 및 배열 유형에 대한 특별한 이름을 만들려고하지 않습니다

struct Person { 
    int age; 
    int height; 
}; 

...

struct Person bob[] = {{7,5},{4,2},{4,3}}; 

( bob은 삼명이기 때문에 이것은 여전히 ​​혼란 스럽다.)

그리고 struct Person

(난 여기가 정의한대로)와 struct internalStruct는 두 가지 종류가 있습니다. 이 두 유형을 지정하려고하면 코드의 디자인 결함을 나타냅니다. 서로 할당하려는 객체는 이어야합니다.은 같은 유형이어야합니다.

추천 도서 : comp.lang.c FAQ, 특히 섹션 6 (배열 및 포인터).

0
두 구조체가 다른 때 메모리 누수로 실행할 수 있기 때문에 나는이 힘든 제안하지 것이다

:

가 각각 비슷한 세 가지 구조의 배열입니다 귀하의 Person 유형이
#include <stdio.h> 
#include <stdlib.h> 

typedef struct { 
    int age; 
    int height; 
} Person[3]; 

struct internalStruct { 
    int age; 
    int height; 
}; 

int main(void) { 

    //Possible 
    Person bob = {{7,5},{4,2},{4,3}}; 

    //Is it possible to assign array to struct? 
    struct internalStruct intr[3] = {{4,32},{2,4},{2,4}}; 
    Person* jon= (Person *)intr; // Does not work :(. 
    printf("%d", jon[0]->height); 
    return 0; 
} 
+0

그 작동하지 않습니다. 난 작업에 intr에 할당 할 수 있어야합니다. – Anonymous

+0

아 그게 네 문제 야, 구조체 타입을 바꾸는 것은 좋은 생각이 아니 겠지만, 포인터로이 일을 할 수있다. 나는 첫 번째 대답을 편집했다. – sharpner

0

struct internalStruct에 따라서 Personstruct internalStruct을 할당 할 수는 있지만 어떤 도움을 받아 Person의 요소 중 하나에 할당 할 수는 있습니다.

또한 C에서 배열을 복사하려면 요소를 복사하거나 memcpy()과 같은 기능으로 메모리 블록을 복사해야합니다.

그래서이 작업을 수행하는 가장 간단한 방법은Person 전에 struct internalStruct을 정의 할 수 있으며, struct internalStruct의 측면에서 Person을 정의하는 것입니다 :

struct internalStruct { 
    int age; 
    int height; 
}; 

typedef struct internalStruct Person[3]; 

이런 식으로 이렇게하면 가능 요소에 struct internalStruct을 할당 할 수 있습니다 형식이 일치하지 않는 Person입니다. 예를 들어 세 struct internalStruct의 배열이있는 경우

struct internalStruct s1 = {4,32}, 
         s2 = {2,4}, 
         s3 = {2,4}; 
Person jon; 
jon[0] = s1; 
jon[1] = s2; 
jon[2] = s3; 

, 당신은 루프를 복사 할 수 있습니다 :

struct internalStruct st[3] = { {4,32}, {2,4}, {2,4} }; 
Person jon; 
for (int i = 0; i < 3; i++) 
    jon[i] = st[i]; 

당신은 다음 struct internalStruct의 측면에서 Person을 정의하지 않으려면 당신은 두 가지 구조의 레이아웃이 동일 할 것이라는 가정을해야합니다. 당신은 당신이 그것을 선언 할 때 배열을 초기화 할 수 있습니다 C에서 배열에 할당 할 수 없습니다

struct internalStruct intr[3] = { {4,32}, {2,4}, {2,4} }; 
Person jon; 
memcpy(jon, intr, sizeof(Person)); 
+0

특정 컴파일러에 대해 다른 구조 (union/enum/typedef)의 메모리 맵을 얻을 수있는 방법이 있습니까? – Anonymous

+0

@Anonymous 컴파일러 설명서를주의 깊게 살펴보아야합니다. 그렇지 않으면 코드에서 'sizeof'가 제공하는지 확인할 수 있습니다 두 구조체의 크기가 같고 각 구조체의 해당 멤버에 대해 'offsetof'가 같은 값을 제공합니다. 일반적으로 동일한 속성 및 동일한 속성으로 정의 된 경우 es, 그들은 일치 할 것이다 - 그러나 그것에 의존하지 않는 것이 좋을 것이다. 그리고 아마 똑같은 두 가지 타입 대신에 같은 타입을 사용하는 것이 더 좋다. – Dmitri