2011-11-07 83 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