关于指针的地址的一个小坑

指针和地址很容易用错,下面就是一个经典的误用案例。

先上代码

        struct head_T
	{
		int entry_nums;
	};
	struct entry_T
	{
		char entry_name[12];
		int entry_data1;
		int entry_data2;
	};
	struct file_T
	{
		head_T head;
		entry_T * entrys;
	};
	int entlen = sizeof(entry_T) * 2;
	int headlen = sizeof(head_T);
	int buflen = headlen + entlen;
	
	FILE* tempFile = fopen("temp.txt", "wb");
	if (tempFile == NULL)
	{
		printf("file not exist.\n");
		return -1;
	}
	entry_T entry[2];
	memset(entry, 0, sizeof(entry_T) * 2);
	strcpy(entry[0].entry_name, "entry 1");
	entry[0].entry_data1 = 1;
	entry[0].entry_data2 = 2;
	
	strcpy(entry[1].entry_name, "entry 2");
	entry[1].entry_data1 = 3;
	entry[1].entry_data2 = 4;
	
	file_T file_temp;
	memset(&file_temp, 0, sizeof(file_T));
	file_temp.head.entry_nums = 2;
	file_temp.entrys = entry;
	
	int Len = fwrite(&file_temp.head.entry_nums, sizeof(int), 1, tempFile);
	Len = fwrite(&file_temp.entrys, sizeof(entry_T), 2, tempFile);
	fclose(tempFile);
	printf("entry num %d\n", file_temp.head.entry_nums);
	printf("entry1  name  %s\n", file_temp.entrys[0].entry_name);
	printf("entry1 data1 %d\n", file_temp.entrys[0].entry_data1);
	printf("entry1 data2 %d\n", file_temp.entrys[0].entry_data2);
	printf("entry2  name  %s\n", file_temp.entrys[1].entry_name);
	printf("entry2 data1 %d\n", file_temp.entrys[1].entry_data1);
	printf("entry2 data2 %d\n", file_temp.entrys[1].entry_data2);
	printf("***************************write ok!\n");

这段代码定义了一个文件结构,然后赋值,写进文件中。但是打开文件发现文件内容是错误的。

问题出在把文件主体写进文件中的那一行

Len = fwrite(&file_temp.entrys, sizeof(entry_T), 2, tempFile);

这一行的本意是把entrys的写入文件中,但是错误的多加了一个取地址的符号&。本来file_temp.entrys本来就是一个指针类型,存放的就是地址,再加一个取地址的符号,就变成了file_temp的第5个字节,存放的是entrys的地址指针,这跟我希望的获取entrys值是不同的。

正确的做法是改为把取地址的符号去掉

Len = fwrite(file_temp.entrys, sizeof(entry_T), 2, tempFile);

地址和指针很容易误用,而且不容易发现。使用时需要非常小心

猜你喜欢

转载自blog.csdn.net/jewelsu/article/details/92760561