这段代码中的问题与`book_w->title`的定义和使用有关。
首先,代码中定义的`struct Book`结构体的`title`成员为`char`类型,而不是`char[]`或`char*`,这会导致后面使用`strcpy(book_w->title,"xiyouji");`时出现问题。
具体来说:
1. **错误的定义:**
struct Book
{
char title;
float price;
struct Date date;
};
这里的`title`仅仅是一个字符,而不是一个字符串。如果你想存储书名(一个字符串),`title`应该定义为字符数组或者指针,例如:
struct Book
{
char title[50]; // 假设书名最长为50个字符
float price;
struct Date date;
};
或者:
struct Book
{
char *title; // 指向一个字符串
float price;
struct Date date;
};
2. **内存问题:**
如果你使用字符指针`char *title`,需要为`title`分配内存,比如通过`malloc`:
book_w->title = (char *)malloc(50 * sizeof(char)); // 分配50个字符的空间
3. **`book_w->date.day=26`赋值问题:**
`book_w->date.day=26` 赋值的问题很可能是由于内存错误引发的。当你错误地处理`title`时,后续内存操作可能会导致其他字段(如`date.day`)受到影响。
### 修复后的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Date
{
int year;
int month;
int day;
};
struct Book
{
char title[50]; // 修改为字符数组
float price;
struct Date date;
};
int main(void)
{
struct Book *book_w, *book_r;
FILE *fp;
// 分配内存
book_w = (struct Book *)malloc(sizeof(struct Book));
book_r = (struct Book *)malloc(sizeof(struct Book));
if (book_r == NULL || book_w == NULL)
{
printf("error");
exit(1);
}
// 结构体赋值
strcpy(book_w->title, "xiyouji"); // 正确的字符串赋值
book_w->price = 29.9;
book_w->date.year = 1999;
book_w->date.month = 9;
book_w->date.day = 26;
// 打开文件写入
if ((fp = fopen("F:/9.9.txt", "w")) == NULL)
{
printf("error");
exit(1);
}
fwrite(book_w, sizeof(struct Book), 1, fp);
fclose(fp);
// 打开文件读取
if ((fp = fopen("F:/9.9.txt", "r")) == NULL)
{
printf("error");
exit(1);
}
fread(book_r, sizeof(struct Book), 1, fp);
// 打印读取的数据
printf("title: %s\n", book_r->title);
printf("price: %.2f\n", book_r->price);
printf("date: %d-%d-%d\n", book_r->date.year, book_r->date.month, book_r->date.day);
fclose(fp);
free(book_r);
free(book_w);
return 0;
}
### 关键修正点:
1. 将`title`修改为`char title[50];`以存储字符串。
2. 使用`strcpy`时可以安全地将字符串复制到`title`数组中。
3. 由于标题问题修复,赋值`book_w->date.day=26`将不再引发问题。
这种修改确保了内存的正确使用,避免了潜在的越界写入问题。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |