指针和地址很容易用错,下面就是一个经典的误用案例。
先上代码
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);
地址和指针很容易误用,而且不容易发现。使用时需要非常小心