将结构数组分配给typedef结构

时间:2011-11-07 19:57:51

标签: c

如何为typedef struct分配具有类似结构的另一个struct数组。

#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;
}

3 个答案:

答案 0 :(得分:5)

您无法在C中分配数组。您可以在声明数组时初始化数组,但数组表达式不能出现在赋值运算符的左侧。

如果要将数组对象的值复制到另一个数组对象中,可以使用显式循环来分配每个元素(假设元素类型是可分配的),或者可以使用memcpy()。 (请注意,对memcpy()的调用需要指定要复制的字节的数量;请使用sizeof。)

你的typedef Person

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

是不明智的。 Person对象(变量)不是人;这是一组3人(人?)。

我的建议:删除typedef并使用struct标签(正如您对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节(数组和指针)。

答案 1 :(得分: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;
}

答案 2 :(得分:0)

您的Person类型是由三个结构组成的数组,每个结构与您的struct internalStruct类似。因此,您不能只将[{1}}分配给struct internalStruct,但您可以(在某些帮助下)将其分配给Person的其中一个元素。

此外,在C中复制数组需要逐个元素复制,或者使用类似Person的函数复制内存块。

所以最简单的方法是在 memcpy()之前定义struct internalStruct ,并用Person定义Person:< / p>

struct internalStruct

这样做可以将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]; 来定义Person,那么你必须做出一些假设,比如两个结构的布局是相同的。如果是这样,您可以使用struct internalStruct复制:

memcpy()