C语言的错误总结

本文介绍了C语言中的相等判断与赋值操作,包括==和=的区别,以及++a和a++的差异。讨论了枚举类型enum的使用和变量的引用。提到了负数的原码转补码规则,并强调了在switch语句中使用break的重要性。文章还涉及了数组初始化、头文件引用、指针初始化和文件封装。此外,讲解了如何处理段错误,特别是通过gdb调试来定位问题,并提醒了动态内存管理中malloc和free的正确使用。
摘要由CSDN通过智能技术生成

        1.1相等为两个==;一个=为赋值;(if判断的条件上判断相等为两个’==‘)

        赋值=左边为变量,右边为常量,常量不可变

        1.2 ++a和a++的理解:

                ++a:a先加一再执行赋值运算;

                a++: 先将a赋于变量之后再加一;

例:

#include <stdio.h>
int main()
{
    Int a = 0;
    int b = 0;
    Int x,y;
    //a++和++a单独使用时
    a++;
    ++b;
    printf("%d---%d\n",a,b);
    //此时的结果为a=1;b=1;
    


    //当++使用赋值语句时
    x = a++;
    y = ++b;
    printf("%d----%d\n",x,y);
    //此时区别就出现了,输出x=0;y=1;
    return 0;
}

        1.3负数的原码——变成补码:按位取反再加1,符号位不参与运算

        1.4 枚举enum:

                Enum data{ A,B,C...};其中A必须给一个初值;后面 的数依次加一;

        1.5 变量的引用:局部变量在执行完模块后(一个{}就是一个模块),其内存空间会被自动释放掉

        1.6 判断真假时,只有为0时才为假,0全为真(即使是符号或者字符,也表示非零);

        1.7 Switch函数,每个语句结束一定不能少break;不然会继续往下执行直到遇到break或者结束;comtinue和break的区别:

               1. continue——跳过本次循环,执行下一次循环;

                2.Break 直接跳出该循环体 ;

        1.8 使用循环语句时,一定要定好对应的结束条件,for和while都是语句为真时才执行对应的功能模块;

        1.9 数组初始化时,一定要注意二维数组不得省略列数;字符串的结束标志是’\0‘,要用到字符时,’\0‘可以作为循环的结束标志;

                1.9.1 定义数组时,大小必须事先定好,数组的下标只能是常量,不能是变量;

        2.0 头文件的引用,如果不知道使用的函数或者其他命令所用到的头文件,可以使用man+指令来查看该函数的信息,头文件必不可少;

        2.1 指针的初始化,当不知道指针的指向时,可以先使用空指针 :

数据类型 *(指针名) =NULL        以避免野指针的出现;

        2.2 如果要使用getchar输入字符时要注意缓冲区域垃圾字符的处理,如果上一个是输入scanf(),输出后getchar()会将’\n‘ 当做一个字符来输入,如果前面输入为gets(),后面就可以正常输入;

                2.2.1 gets和printf的区别:

                scanf :当遇到回车,空格和tab键会自动在字符串后面添加’\0’,但是回车,空格和tab键仍会留在输入的缓冲区中。

                gets:可接受回车键之前输入的所有字符,并用’\0’替代 ‘\n’.回车键不会留在输入缓冲区中

int mian()
{
    Char str[32] = {0};
    Scanf(“%s”,str);
    Puts(str);
    Char arr;
    Arr = getchar();
    Putchar(arr);
    //这里str输出后,会残留一个’\n’,getcahr()会将这个当做输入的字符;

    

    Char str[32] = {0};
    gets(str);
    Puts(str);
    Char arr;
    Arr = getchar();
    Putchar(arr);
    //这里getchar就可以正常输入
}

        getchar()的作用:清理缓冲区的垃圾字符 ’\n‘’空格‘’TAB‘等;

        

        2.3 文件封装

     1. 头文件的封装(头文件名.h):        2. 功能函数的封装:.c文件       3. 主函数的封装:.c文件

                #ifndef  _文件名_                      自定义的头文件                                    自定义的头文件

                #define _文件名_                        功能函数体;                                      main函数()

                所有用到的头文件

                函数声明;        

                #endif

        2.4 段错误的解决

                2.4.1 内存的分配:

                1.静态内存区(编译时计算机自动分配):存储静态全局变量,静态局部变量,全局变量;

                2.动态内存区:(运行时分配)包括栈区和堆区;

                2.1:栈区:存储函数的形参和局部变量(运行完自动释放)【编译器管理】

                堆区:自己通过指定的函数所分配的空间,需要自己手动分配【free()】,这些不会自动释放.【程序员管理】  

段错误的原因

1.程序访问的内存超出了所开辟的内存大小。

2.某个程序发生越界访问(数组越界,变量数据类型不一致)时,CPU会发生相应的保护程序,于是segmentation fault就出现了,错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的,还有可能是缺少文件或者文件损坏。

        其一的解决方法:

                通过gdb调试来查看段错误的行数;

                        步骤:

                                1.gcc -g 加文件名 -o 要生成的可执行文件的名字;(- g会产生一个gdb可调试的文件)

                                2.gdb 可执行文件的名字;

                2.4.2 gdb 的部分用法

R:开始调试,运行到断点

显示代码内容:

L+行号:

不加行号,默认查看10行;

Where:查看当前的位置

Until+行号:执行到该行;

断点设置:

B+行号:在b行打断

D+行号:删除断点

C:从当前位置开始调试到下一个断点

q:退出调试

        2.5 定义动态内存时,内存是有限的,变量使用完后要使用free()来释放运行完的变量,释放完的变量不能再次进行释放,如果再次释放,程序会直接崩溃。malloc 和 free 一定要成对存在,一一对应。有 malloc 就一定要有 free,有几个 malloc 就要有几个 free,每释放一个指向,动态内存的指针变量后要立刻把它指向 NULL,避免指针变成野指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值