同类型结构体之间赋值不一定有效

同类型结构体之间赋值不一定有效

今天为这个问题debug好久...

之前看到一个关于结构体使用的技巧, 这个技巧能够避免内存零碎. 保证结构体所属内存尽量不要零散化.

struct struct_name

{

element_type varible;

...;

element_type  pointer[0];

}

关于该用法的介绍.

http://blog.csdn.net/cinmyheart/article/details/28985843

对于普通的结构体,

	struct num
	{
		int x;
		int y;
	};

这种类型的结构体就可以通过赋值operator =赋值

但是!

上面介绍的那种特殊用法不行.

#include <stdio.h>
#include <stdlib.h>

int main()
{
	struct node
	{
		int a;
		char string[0];
	};

	struct num
	{
		int x;
		int y;
	};

	struct num m = {1,3};
	struct num n = {2,4};

	/*
	**	ATTENTION! m = n;
	*/
	m = n;

	printf("m.x:%d m.y:%d n.x:%d n.y:%d\n",m.x,m.y,n.x,n.y);

	struct node* p_string_1 = (struct node*)malloc(sizeof(100)+sizeof(int));
	struct node* p_string_2 = (struct node*)malloc(sizeof(100)+sizeof(int));

	char hello[] = {"Hello world\n"};
	char panic[] = {"Don't panic\n"}; 

	int tmp = 0;

	for(tmp = 0;tmp < sizeof(hello)/sizeof(hello[0]); tmp++)
	{
		p_string_1->string[tmp] = hello[tmp];
	}

	for(tmp = 0;tmp < sizeof(panic)/sizeof(panic[0]); tmp++)
	{
		p_string_2->string[tmp] = panic[tmp];
	}

	printf("1:%s2:%s\n",p_string_1->string,p_string_2->string);

	/*
	**	ATTENTION! HERE IS AN EVEIL!
	*/
	*p_string_1 = *p_string_2;

	printf("1:%s2:%s\n",p_string_1->string,p_string_2->string);

	free(p_string_1);
	free(p_string_2);

	return 0;
}

猜猜看,打印的结果是什么?

时间: 2024-10-27 07:43:58

同类型结构体之间赋值不一定有效的相关文章

结构体指针之间和结构体之间的强制类型转换那些事

结构体指针的强制类型转换在链表的使用中是非常有用的一种方式: (比如我们有一条链表(我们知道每一个链表的节点都是一种结构体),而链表中的每一个节点又是某一个结构体中的成员, 我们就可以通过查询链表的节点,通过将节点强制转换为某个结构体,然后我们就可以方便的使用某个结构体的其他成员了). 那么结构体之间的强制转换又是基于什么的原理实现的呢?需要明白下面几点: 1.结构体声明如何内存的分布,  2.结构体指针声明结构体的首地址,  3.结构体成员声明该成员在结构体中的偏移地址 举个例子: typed

C语言 结构体指针赋值 incompatible types when assigning to type &#39;char[20]&#39; from type &#39;char *&#39;

strcpy(pstudent->name, "guo zhao wei "); 为什么错误,该怎么写,(红色行) 追问 为什么不能直接赋值啊, 追答 用char nnnn[20]定义的,用strcpy 用char *ppp定义的,用=来赋值 C语言 结构体指针赋值 incompatible types when assigning to type 'char[20]' from type 'char *'

用隐式转换实现类型或结构体直接赋值

在vs中敲一句string s="aaa"; 你会发现string是个class,一般咱们给类型赋值的时候都是先new一个,然后再给其属性赋值,string却能直接赋值,顿时感觉很神奇 当然,在stirng s = "aaa";中,右面的“aaa”它其实就是个string类型,所以直接=是没有问题的 但是,由string s ="aaa";我们就可以提出一个假象,咱们自己定义的class能不能也实现类似的效果呢? 答案显然是肯定的~~~~ 这需要

(转)关于linux中内核编程中结构体的赋值操作(结构体指定初始化)

网址:http://blog.chinaunix.net/uid-24807808-id-3219820.html 在看linux源码的时候,经常会看到类似于下面的结构体赋值的代码: struct device my_dev = { .bus = &my_bus_type, .parent = &my_bus, .release = my_dev_release, }; 整体上看,貌似与我们平时遇到的结构题赋值差不多,可是在变量前面加了一个点,好像我们就不知道是什么意思了.  上面的这种赋

对于结构体变量赋值的误区

以前在使用结构体时没有在结构体变量之间直接赋值,今天同事在查看别人的代码时,发现有两个结构体变量直接赋值的语句当时感觉这个语句不对,认为在一个结构体里边,既有一般的无符号整形与数组,因为数组的赋值是不能直接赋值,要内存拷贝,从这里推理所以认为这个语句不对.于是问了一下,我当时以为是结构体指针变量的赋值,认为没有问题.还和同事争论了一番,当他让我看源代码时,发现是变量间的直接赋值,下意识中的判断是不对,原因就和之前他理解的一样. 于是晚上到住处在网上查了一下,说是可以的,因为是同样的数据类型,而C

C和指针 第十二章 结构体 整体赋值 error: expected expression

定义结构体后整体赋值时发生错误 typedef struct NODE { struct NODE *fwd; struct NODE *bwd; int value; } Node; //声明变量 Node first; first = {NULL, &second, 4}; 错误: error: expected expression 之所以不行是,{}内容被当做语句块了,c语言允许直接对结构体初始化,或者在赋值的时候加上类型说明,或者是逐一赋值. 初始化赋值: typedef struct

GO语言编程基础-复合类型结构体

大家好,我们是链客区块链技术问答社区,今天讲一讲Go语言的基础编程. 链客,有问必答!!! 1 结构体类型 有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性.显然单独定义以上变量比较繁琐,数据不便于管理. 结构体是一种聚合的数据类型,它是由一系列具有相同类型或不同类型的数据构成的数据集合.每个数据称为结构体的成员. 2 结构体初始化 2.1 普通变量 type Student struct { id   int name string sex  

HpUnix .Net 结构体之间的纠结

相思之苦 在HpUnix 的C++近日深感孤独,想找远在Windows上的C#小弟聊聊天,双方决定通过 Socket进行通信.协议是只有他们自己能够了解的内部协议,说白了就是自定义的结构体.^_^ 好基友在定义了一个消息体和一个回复消息体,其中都包含一个头结构包含这个消息的序列号.消息的类型.消息休的总长度,我交代的事有无办妥的状态. C++中header的定义: + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

c语言中,结构体的赋值

c语言里,不能直接在定义结构体时,给其中元素赋值. #include<stdio.h>#include<malloc.h>typedef struct tree{    int data;    struct tree *left;    struct tree *next=NULL;}zhizhen;int main(){    struct tree *a;    a=(zhizhen*)malloc(sizeof(zhizhen));    if(a->next==NU