如何为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;
}
答案 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()