指针:指针是什么?
指针是一个变量,它就是一个地址。它所占的空间是四个字节(32位的操作系统);
int *p;
p:指针的变量所对应的空间值是指是指分配到空间里面的值;
*p:指针所指向的空间的值是指指针所分配里面空间里的值(地址)的所对应的空间的值;
野指针:是指指针随机指向内存中的内存,导致内存的泄漏;
1.指向已经释放的内存;
2.指向不能访问的内存;
段错误是指内存的出错;
一些看法:
char * ptr = "hello world";
这仅仅是将常量的h的地址赋给ptr,没有段错误的产生;
printf("%s",ptr);
这也没有报段错误;说明它能对打印;
至少说明对其输出没有段错误;
*ptr = 'H';
运行的话将会有段错误。
至少说明一点,段错误是在其指针对其指向的空间没有修改的权力。因为这是一个常量字符串的首地址
赋值给ptr,并没有将那段空间分给它,就是没有权力。
如何避免野指针的出现:
首先养成良好的编码的习惯,
1.在定义指针的时候的,应该初始化为NULL,(没有指向时)
初始化为NULL,便于查找,
NULL的宏定义:#define NULL void* 0;
0 地址不可以访问以及操作
void* 是万能的指针类型:万能指针是指所有类型的指针都能给其 定义的变量进行赋值,但是不能读取操作
2.在没有空间分配的指针,在其需要赋值的之前,应该先进行手动的空间的分配。(malloc.calloc,realloc)
在调用malloc(以其为例)分配空间后,应该检验空间是否分配成功,因为其没有分配成功空间的返回的值
是NULL,所以用if语句来判断;
检验后,应该进行分配空间的初始化。(calloc,自动为0),可以用函数memset,bzero.
因为手动的分配的空间是在堆空间里面分配,这段空间的使用权是用户,在用完后,应该手动的释放空间,
使用free
释放空间以后还需要将指针的再次初始化为NULL。
指针是一个变量,它就是一个地址。它所占的空间是四个字节(32位的操作系统);
int *p;
p:指针的变量所对应的空间值是指是指分配到空间里面的值;
*p:指针所指向的空间的值是指指针所分配里面空间里的值(地址)的所对应的空间的值;
野指针:是指指针随机指向内存中的内存,导致内存的泄漏;
1.指向已经释放的内存;
2.指向不能访问的内存;
段错误是指内存的出错;
一些看法:
char * ptr = "hello world";
这仅仅是将常量的h的地址赋给ptr,没有段错误的产生;
printf("%s",ptr);
这也没有报段错误;说明它能对打印;
至少说明对其输出没有段错误;
*ptr = 'H';
运行的话将会有段错误。
至少说明一点,段错误是在其指针对其指向的空间没有修改的权力。因为这是一个常量字符串的首地址
赋值给ptr,并没有将那段空间分给它,就是没有权力。
如何避免野指针的出现:
首先养成良好的编码的习惯,
1.在定义指针的时候的,应该初始化为NULL,(没有指向时)
初始化为NULL,便于查找,
NULL的宏定义:#define NULL void* 0;
0 地址不可以访问以及操作
void* 是万能的指针类型:万能指针是指所有类型的指针都能给其 定义的变量进行赋值,但是不能读取操作
2.在没有空间分配的指针,在其需要赋值的之前,应该先进行手动的空间的分配。(malloc.calloc,realloc)
在调用malloc(以其为例)分配空间后,应该检验空间是否分配成功,因为其没有分配成功空间的返回的值
是NULL,所以用if语句来判断;
检验后,应该进行分配空间的初始化。(calloc,自动为0),可以用函数memset,bzero.
因为手动的分配的空间是在堆空间里面分配,这段空间的使用权是用户,在用完后,应该手动的释放空间,
使用free
释放空间以后还需要将指针的再次初始化为NULL。