为什么我不能互换地分配两个具有相同内容的结构?

时间:2009-04-13 16:33:29

标签: c struct

我正在努力学习C,而且我遇到了一些奇怪的东西:

struct
{
  int i;
  double j;
} x, y;

struct
{
  int i;
  double j;
} z;

在这里,您可以看到我创建了两个在其元素中相同的struct

为什么当我尝试分配x = z时,它会生成编译错误但x = y不会?它们具有相同的内容,为什么我不能相互分配它们,无论如何?

我有什么方法可以做到这一点,所以可以分配x = z?或者它们只需要是相同的struct

任何C大师都能指出我正确的方向吗?

5 个答案:

答案 0 :(得分:13)

它们具有相同的内容,但类型不同。如果它们属于同一类型,则只需typedef x z;。如果它们不是同一个东西,但恰好包含相同的字段,那么最好创建一个能够正确分配字段的单独函数。


我在C中声明结构的通常样式包括typedef,所以我忘了提它(对不起!)。这是语法:

typedef struct
{
  int foo;
  double bar;
} x;

/* Further down, if needed */
typedef x z;

答案 1 :(得分:8)

使相同结构的类型相同称为“duck typing”。这是用某些语言完成的,但不是用C语言。

答案 2 :(得分:6)

编译器不会计算可能具有相同结构的结构之间的“类型等价”,因此就第一个结构而言,第二个结构与第一个结构无关。

它可以执行x和y,因为它们是同时声明的。

为什么要重新声明结构?您应该输入一次结构(例如,在H文件中)以使其成为实际类型,然后声明实例。

Here's a good tutorial on typedefs for structs.

答案 3 :(得分:5)

struct mystruct
{  
int i;  
double j;  
};

struct mystruct x, y;
struct mystruct z;

如果您打算在它们之间复制数据,则必须使用相同的标识声明它们。你有两个声明,它们对编译器是相同的,它们是两个不同的结构,并且编译器不应该检测它们的相似性。

答案 4 :(得分:0)

C根据名称区分struct,如果它们是匿名的,则不同的结构定义是不同的。

无论如何,当x = zx是结构时,经典C不允许z - 是ANSI还是C99的添加?无论如何,你应该改为使用

#include <string.h>
memcpy(&x, &z, sizeof(x));