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有效

浙公网安备 33010602011771号