鱼C论坛

 找回密码
 立即注册
查看: 2239|回复: 6

[已解决]segmentation fault

[复制链接]
发表于 2023-2-15 19:53:09 | 显示全部楼层 |阅读模式

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

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

x
输入数据为:
Liu Mengmeng
0821131666666
88 90 93 91 85
输入进去后会报错,貌似是数组越界?但是没明白为什么
#include<stdio.h>

struct Student{
        char name[200];
        char id[200];
        int score[5];
        double avreage;
        int total;
};


int main()
{        
        struct Student one;
         
        scanf("%s", one.name);
        scanf("%s", one.id);
        for(int i = 0;i < 5; i++)
        {
                scanf("%d", one.score[i]);        
        }
        for(int i = 0;i<4;i++)
        {
                if(one.score[i] < one.score[i+1])
                {
                        int temp;
                        temp = one.score[i];
                        one.score[i+1] = one.score[i];
                        one.score[i] = temp;
                        i = 0;
                }
        }
        for(int i = 0;i<4;i++)
        {
                one.total += one.score[i];
        }
        printf("Name:%s\n", one.name);
        printf("ID:%s\n", one.id);
        for(int i = 0;i < 4; i++)
        {
                printf("Score:%d ", one.score[i]);        
        }
        for(int i = 0;i<4;i++)
        {
                printf("Score:%d\n ", one.score[i]);
        }
        printf("average:%.2f ", one.total/5);
        printf("total:%d", one.total);
        
        return 0;
 } 
最佳答案
2023-2-16 13:24:26
本帖最后由 ExiaGN001 于 2023-2-18 15:45 编辑

有用请设置最佳谢谢
另:希望本版鱼油在提问的时间注意以下几点:
1. 提问尽量不要点将,例如: 小甲鱼来问答下...  XX来回答下... (影响他人回帖积极性)
2. 代码大于20行以上时,最好写清自己的思路和注释,这样回答的人才能尽快给大家答案!(避免扔上一大堆代码,说是有错误,请人指点!)
3. 发代码请务必使用编辑器的“添加代码文字”(这个符号:<>)
(以上是官方说法)

Bug报告:

Bug类型:
C语言—运行出错(RE)
程序返回值:-1073741819 (0xC0000005)

分析结果:
采用了错误的输入数据(程序本身无问题)

解释/原因:
C语言里,scanf函数在读取字符串时会读取到第一个空白符停止,而空白符会被忽略。
空白符包括Tab键,空格和换行符。
而分析输入数据:
Liu Mengmeng
0821131666666
88 90 93 91 85
可以注意到内容是如下格式:
%s %s
%s
%d %d %d %d %d
而程序的读入格式是:
%s
%s
%d%d%d%d%d
%d与%s不兼容导致程序在运行时退出。

在C++中可通过使用getline()或cin.getline读取一行(读到设置的字符上限或换行符时才停止)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-15 19:58:30 | 显示全部楼层
用 gdb/lldb 之类的工具调试看看在哪里出现的问题?
加上 -fsanitize=address 重新编译之后再运行看看?
这些都是追踪这种小程序出现段错误的非常好用的手段
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-15 20:23:01 | 显示全部楼层
本帖最后由 jackz007 于 2023-2-15 23:34 编辑

        Segmentation fault 错误十有八九与指针有关,因为向无效内存地址写入(读取)数据从而导致程序奔溃。
        此句
                scanf("%d" ,  one.score[i]); 
        改为
               scanf("%d", & one . score[i]); // 提供给 scanf() 函数用于接收数据的参数必须是有效的内存地址,因为,scanf() 会把这个参数的值作为内存地址使用,而 one . score[i] 的值几乎不可能恰好就是一个合法的内存地址,这就是导致程序奔溃的直接原因。
     
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 1

使用道具 举报

发表于 2023-2-16 13:24:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 ExiaGN001 于 2023-2-18 15:45 编辑

有用请设置最佳谢谢
另:希望本版鱼油在提问的时间注意以下几点:
1. 提问尽量不要点将,例如: 小甲鱼来问答下...  XX来回答下... (影响他人回帖积极性)
2. 代码大于20行以上时,最好写清自己的思路和注释,这样回答的人才能尽快给大家答案!(避免扔上一大堆代码,说是有错误,请人指点!)
3. 发代码请务必使用编辑器的“添加代码文字”(这个符号:<>)
(以上是官方说法)

Bug报告:

Bug类型:
C语言—运行出错(RE)
程序返回值:-1073741819 (0xC0000005)

分析结果:
采用了错误的输入数据(程序本身无问题)

解释/原因:
C语言里,scanf函数在读取字符串时会读取到第一个空白符停止,而空白符会被忽略。
空白符包括Tab键,空格和换行符。
而分析输入数据:
Liu Mengmeng
0821131666666
88 90 93 91 85
可以注意到内容是如下格式:
%s %s
%s
%d %d %d %d %d
而程序的读入格式是:
%s
%s
%d%d%d%d%d
%d与%s不兼容导致程序在运行时退出。

在C++中可通过使用getline()或cin.getline读取一行(读到设置的字符上限或换行符时才停止)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-16 13:44:42 | 显示全部楼层
ExiaGN001 发表于 2023-2-16 13:24
有用请设置最佳谢谢
另:希望本版鱼油在提问的时间注意以下几点:
1. 提问尽量不要点将,例如: 小甲鱼来 ...

C 语言里无解?真的吗?
https://en.cppreference.com/w/c/io/fgets
https://en.cppreference.com/w/c/experimental/dynamic/getline

评分

参与人数 1鱼币 +2 收起 理由
ExiaGN001 + 2 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-2-16 13:45:46 | 显示全部楼层
dolly_yos2 发表于 2023-2-16 13:44
C 语言里无解?真的吗?
https://en.cppreference.com/w/c/io/fgets
https://en.cppreference.com/w/c/ ...

忘了这俩(悲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-25 22:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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