在计算机当中我们创建变量的过程是,向内存申请空间来储存。而往往我们在使用指针的时候容易写成int*p这种,而没有申请内存空间。p所指向的就会是随机的空间,而这个给空间可能不存在,可能正在被使用就会造成访问越界,即段错误;
所以段错误的意思:访问了不能访问的内存空间;
所以常常说指针的初始化过程尤为重要,当我们不确定指针需要指向什么,就可以写
int*p=NULL;这个时候内存空间为我们找了一个空内存,指针指向它,当我们确定了指针需要指向什么的时候就可以在重新指向,例如:int a = 10;int*p=&a;这样就完成了重新指向;
那么根据段错误的成因,就需要了解怎么合法使用内存:
1.系统给分配的内存,例如:int a=0(也就是初始化过程同上);
2.用户向内存申请空间(堆内存),记住是动态内存分配(常常使用malloc);
下面简单写个代码,介绍如何使用malloc,注释部分详细介绍了如何使用:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* p;//因为申请的内存是随机的,也就是随机指向一个地址
*p = 100;//给随机的地址赋值,就会造成段错误:访问了不能访问的内存;
//如何合法的使用内存;
//1.系统给分配的内存,例如:int a=0;
//2.用户向内存申请空间(堆内存),记住是动态内存分配(malloc)
char* str = (char*)malloc(32);//malloc是向内存申请空间,返回的是内存,需要进行类型转换;
free(str);//使用完以后要释放内存,不然会造成内存泄露;
*str = NULL;//使用完以后把*str指向为空
return 0;
}
需要注意的地方:
1.用户向内存申请空间是(堆内存),记住是动态内存分配运行的时候分配内存;
2.malloc是向内存申请空间,返回的是内存,需要进行类型转换(根据使用类型确定)
3.free(str);//使用完以后要释放内存,不然会造成内存泄露;
4.记得包含头文件#include<stdlib.h>;
5.*str = NULL;//使用完以后把*str指向为空;