鱼C论坛

 找回密码
 立即注册
查看: 812|回复: 5

[已解决]帮我看看哪儿里错了,关于结构体的?

[复制链接]
发表于 2023-12-25 22:21:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
为什么main函数里,用注释的写法就可以正常运行,用现在的写法,输入的时候,第25行会报错:Segmentation fault
#include <stdio.h>

struct Date 
{
    int year;
    int month;
    int day;
};

struct Book
{
    char title[128];
    char author[40];
    float price;
    struct Date date;
    char publisher[40];
};

struct Book *getInput(struct Book *book);
void printBook(struct Book *book);

struct Book *getInput(struct Book *book)
{
    printf("请输入书名:");
    scanf("%s", book->title);
    printf("请输入作者:");
    scanf("%s", book->author);
    printf("请输入售价:");
    scanf("%f", &book->price);
    printf("请输入出版日期:");
    scanf("%d-%d-%d", &book->date.year, &book->date.month, &book->date.day);
    printf("请输入出版商:");
    scanf("%s", book->publisher);

    return book;
}

void printBook(struct Book *book)
{ 
    printf("\n\n======开始打印书籍信息======\n\n");
    printf("书名:%s\n", book->title);
    printf("作者:%s\n", book->author);
    printf("售价:%.2f\n", book->price);
    printf("日期:%4d-%2d-%0.2d\n", book->date.year, book->date.month, book->date.day);
    printf("出版社:%s\n", book->publisher);
}

int main(void)
{
    struct Book *book = NULL;
    // struct Book book;
    // struct Book *my_book = getInput(&book);
    struct Book *my_book = getInput(book);
    printBook(my_book);

    return 0;
}
最佳答案
2023-12-25 23:04:10
int main(void)
{
    struct Book * book = NULL              ; // 【错误】:这样定义的 book 只是一个指针,而指针是不能储存结构体数据的,你需要定义的是一个结构体
    struct Book * my_book = getInput(book) ; // 【错误】:book 被初始化为 NULL 也就是 0 值,是一个无法访问的内存地址,所以,就出错了。
    printBook(my_book);

    return 0;
}
        这样写才对
int main(void)
{
    struct Book book  ; 
    getInput(& book)  ; 
    printBook(& book) ;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-12-25 22:21:36 | 显示全部楼层
问题出在第18行,你需要给字符数组分配足够的空间来存储输入的字符串。当前的定义是`char title`,这只能存储一个字符,应该修改为`char title[50]`,这样就可以存储最多50个字符的字符串了。同样,也需要修改`char author`和`char publisher`的定义。

另外,第25行的错误是因为传递给`getInput`函数的参数`book`为空指针。你可以通过将`struct Book book;`改为`struct Book *book = malloc(sizeof(struct Book));`来动态分配内存,并确保在使用完之后使用`free(book);`来释放内存。

修改后的代码如下:
#include <stdio.h>#include <stdlib.h>struct Date {    int year;    int month;    int day;};struct Book{    char title[50];    char author[50];    float price;    struct Date date;    char publisher[50];};struct Book *getInput(struct Book *book);void printBook(struct Book *book);struct Book *getInput(struct Book *book){    printf("请输入书名:");    scanf("%s", book->title);    printf("请输入作者:");    scanf("%s", book->author);    printf("请输入售价:");    scanf("%f", &book->price);    printf("请输入出版日期:");    scanf("%d-%d-%d", &book->date.year, &book->date.month, &book->date.day);    printf("请输入出版商:");    scanf("%s", book->publisher);    return book;}void printBook(struct Book *book){     printf("\n\n======开始打印书籍信息======\n\n");    printf("书名:%s\n", book->title);    printf("作者:%s\n", book->author);    printf("售价:%.2f\n", book->price);    printf("日期:%4d-%2d-%0.2d\n", book->date.year, book->date.month, book->date.day);    printf("出版社:%s\n", book->publisher);}int main(void){    struct Book *book = malloc(sizeof(struct Book));    struct Book *my_book = getInput(book);    printBook(my_book);    free(book);    return 0;}
这样修改后,你应该可以正常运行程序并且不会报错了。记得在使用完动态分配的内存后,要及时使用`free`函数释放内存。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-25 22:25:53 | 显示全部楼层
FishC 发表于 2023-12-25 22:21
问题出在第18行,你需要给字符数组分配足够的空间来存储输入的字符串。当前的定义是`char title`,这只能存 ...


你的回答虽然不对,但提醒了我,谢谢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-25 22:26:01 | 显示全部楼层
hanghanga 发表于 2023-12-25 22:25
你爹回答虽然不对,但提醒了我,谢谢。

非常抱歉,如果我的回答有任何错误。如果你有其他问题或需要进一步的帮助,请随时告诉我。我会尽力提供正确的解答。祝你编程愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-25 22:58:19 | 显示全部楼层
struct Book *getInput(struct Book *book)
{
    printf("请输入书名:");
    scanf("%s", &book->title);
    printf("请输入作者:");
    scanf("%s", &book->author);
    printf("请输入售价:");
    scanf("%f", &book->price);

没取地址,直接用了野变量(本人不是很擅长c/c++, 有错请指正)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-25 23:04:10 | 显示全部楼层    本楼为最佳答案   
int main(void)
{
    struct Book * book = NULL              ; // 【错误】:这样定义的 book 只是一个指针,而指针是不能储存结构体数据的,你需要定义的是一个结构体
    struct Book * my_book = getInput(book) ; // 【错误】:book 被初始化为 NULL 也就是 0 值,是一个无法访问的内存地址,所以,就出错了。
    printBook(my_book);

    return 0;
}
        这样写才对
int main(void)
{
    struct Book book  ; 
    getInput(& book)  ; 
    printBook(& book) ;
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-5 02:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表