c语言易错点

1. 在运行.o的时候操作系统会对虚拟内存进行分区   补充:利用程序的局部性,将硬盘上的空间虚拟成内存,这样在计算机内存有限的情况下就可以同时运行多个程序了

  程序运行前为什么还占据内存???

  cpu在程序执行前有个临界状态,需要占用内存,提高内存效率,进而与此程序相关的虚拟内存将分为执行前,执行后

从低到高分别为:

执行前:代码区,bss(block start by symbol)段(存放未初始化),data段(存放初始化)

执行后:代码区,(补充)文字常量区(存放字符串),全局区,堆区(地址从低向高存储),栈区

 

 补充:

 

 

 

 https://www.jianshu.com/p/a937c4deb315

 2. 什么时候产生野指针

  a.野指针:指向不合法的内存区域的指针

  b. 指针未初始化,free后未指向null,超越指针变量该指向的范围

3.指针作为函数参数的输入输出特性

https://blog.csdn.net/grey_street/article/details/105627789

 4. 结构体的深拷贝与浅拷贝

浅拷贝:对存在指针成员的结构体直接赋值,导致结构体中的指针变量指向同一地址,在释放时重复释放同一段空间(段错误)

深拷贝:为新结构体变量的成员指针,分配独立的空间

补充:free只能free堆区空间,否则段错误

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 typedef struct stu
 4 {
 5     char* name;
 6     int score;
 7 }STU;
 8 int main(int argc, char const *argv[])
 9 {
10     STU lihua,xiaoming;
11     lihua.name ="lihua";
12     lihua.score=99;
13     
14     printf("%s",lihua.name);
15     if (NULL!=lihua.name)
16     {
17         free(lihua.name);
18         lihua.name=NULL;
19     }
20     return 0;
21 }

 

浅拷贝实例(核心已转储):

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct stu
{
    char* name;
    int score;
}STU;
int main(int argc, char const *argv[])
{
    STU lihua;
    lihua.name=(char*)malloc(100);
    strcpy(lihua.name,"lihua");

    STU xiaoming;
    xiaoming.name=(char*)malloc(100);
    strcpy(xiaoming.name,"xiaoming");
    
    lihua=xiaoming;//让lihua.name的指针指向了xiaoming.name的空间
    
    printf("%s\n",lihua.name);
    if (NULL!=lihua.name)//实则释放当初xiaoming.name所指向的空间
    {
        free(lihua.name);
        lihua.name=NULL;
    }
    if (NULL!=xiaoming.name)//再次释放xiaoming.name所指向的空间
    {
        free(xiaoming.name);
        xiaoming.name=NULL;
    }
    
    return 0;
}

 

深拷贝实例:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct stu
{
    char* name;
    int score;
}STU;
int main(int argc, char const *argv[])
{
    STU lihua;
    lihua.name=(char*)malloc(100);
    strcpy(lihua.name,"lihua");

    STU xiaoming;

    #if 0
    //浅拷贝
    xiaoming=lihua;
    #endif

    #if 1
    //深拷贝
    xiaoming.name=(char*)malloc(100);
    strcpy(xiaoming.name,lihua.name);
    #endif
    
    printf("%s\n",xiaoming.name);
    if (NULL!=lihua.name)
    {
        free(lihua.name);
        lihua.name=NULL;
    }
    if (NULL!=xiaoming.name)
    {
        free(xiaoming.name);
        xiaoming.name=NULL;
    }
    
    return 0;
}

 5. 结构体的对齐规则

第一步:确定分配单位(每行开辟多少字节)
结构体中最大的基本类型的长度 为分配单位。
#pragma pack (value)时的指定对齐值value
min(value,最大的基本类型的长度) 为分配单位。
第二步:确定成员的偏移位置。
偏移位置:成员自身类型的整数倍(0~n倍)
(如果是结构体嵌套结构体,那么结构体成员的偏移位置为结构体成员的最大基本类型的整数倍)
第三步:收尾工作:
结构体的总大小必须是分配单位的整数倍。
 
6.关于static
1.用于修饰全局变量
2.使全局变量只在当前.c有效
posted @ 2021-02-06 22:07  sailuoaoteman  阅读(116)  评论(0)    收藏  举报