2011-11-07 112 views
1

如何將struct的數組分配給typedef 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 height; }; typedef struct internalStruct Person [3];'? –

+0

我只是想了解內存結構是否相同(3的數組的typedef是相同的內存結構,以及只是一個普通的3結構數組,我實際上不是在C編碼。 – Anonymous

回答

4

您不能分配到一個數組中C.在聲明它可以初始化數組,而是一個數組表達式不能出現在賦值運算符的左側。

如果要將數組對象的值複製到另一個數組對象中,可以使用顯式循環來分配每個元素(假定元素類型可分配),也可以使用memcpy()。 (請注意,memcpy()呼叫需要指定的字節數複製;使用sizeof這一點。)

和你的typedef Person

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

是不明智的。 A Person對象(變量)不是一個人;它是由3人組成的(人們?)。

我的建議是:丟棄的typedef,只是使用結構標籤(因爲你已經對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

我不建議這個艱難的,因爲你可能在這兩個結構是不同碰到內存泄漏:

#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

這是行不通的。需要能夠分配給內部工作 – Anonymous

+0

啊這是你的問題,以及它可能不是一個好主意,但你可以用指針來做到這一點,我編輯我的第一個答案。請注意類型:job!= jon – sharpner

0

Person型三種結構,數組每一個都是相似到你的struct internalStruct。所以,你不能只將struct internalStruct分配給Person,儘管你可以(有一些幫助)將它分配給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 s1 = {4,32}, 
         s2 = {2,4}, 
         s3 = {2,4}; 
Person jon; 
jon[0] = s1; 
jon[1] = s2; 
jon[2] = s3; 

如果你有三個struct internalStruct秒的數組,你可以用循環複製:

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,然後你必須做出一些假設,例如兩個結構的佈局將是相同的。如果是這樣,你可以用memcpy()複製:

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

有沒有辦法爲特定的編譯器獲取不同結構(聯合/枚舉/ typedef)的內存映射? – Anonymous

+0

@匿名仔細篩選編譯器的文檔?否則,在代碼中,您可以檢查'sizeof'兩個結構的大小相同,並且'offsetof'給出了每個結構中相應成員的相同值。通常,如果它們以相同的方式定義並且具有相同的屬性他們會匹配 - 但最好不要依賴它,而只是使用相同的類型而不是兩種*可能*相同的類型。 – Dmitri