首页 > 代码库 > 同类型结构体之间赋值不一定有效

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

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


今天为这个问题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;
}



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


































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