指向不可用或者不应该被使用的内存的指针(注意,不是NULL指针)
成都创新互联公司服务项目包括邓州网站建设、邓州网站制作、邓州网页制作以及邓州网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,邓州网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到邓州省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!2、产生野指针的原因1、指针变量没有初始化。属于栈区的变量没有初始化,如果没有初始化,值是不确定的。也就是说,没有被初始化的指针,指向的是不应该被使用的内存,如果使用了该内存,会产生不可知的错误。
#includeint main()
{
int *p;
printf("%p\n",p);
*p = 10;
printf("%d\n", *p);
return 0;
}
2、指向堆区的指针被free()后,没有置为NULL。free()函数是把指针所指向的内存区域释放,使得该区域成为自由内存,可以被再次分配。但是,函数并没有把指针本身的内容置空,指针仍然指向已经被释放的堆内存。
#include#includeint main()
{
int *p = malloc(sizeof(int));
if(!p){
printf("malloc error\n");
exit(1);
}
printf("p:%p\n",p);
*p = 10;
printf("*p:%d\n", *p);
free(p);
printf("p:%p\n",p);//p指针本身的值还是free()之前的值
printf("*p:%d\n", *p);//该内存在没有被再次被分配重新赋值之前还是原来的值
int *i = malloc(sizeof(int));
if(!i){
printf("malloc error\n");
exit(1);
}
printf("i:%p\n",i);//该内存区域被释放,可以被再次分配
*i = 20;
printf("*i:%d\n", *i);
*p = 10;
printf("*i:%d\n", *i);//i指针指向的内存区域被p指针修改了,但这是不应该发生的
free(i);
i = NULL;
P = NULL;
return 0;
}
3、指针操作越界。C语言不做越界检查,所以由于程序逻辑上的错误,导致指针访问了不应该访问的内存。常见的是数组越界。
#includeint main()
{
int arr[5] = {1,2,3,4,5};
for(int i = 0; i<= 5; ++i)
{
printf("%d\t",arr[i]);
}
printf("\n");
}
4、指针函数返回指向栈内存的指针。函数指针会返回一个指针,然后在主调函数中使用该指针指向的内存。因此,指针函数不能返回在该函数内指向栈内存的指针,因为栈区是由程序自动释放。
#includeint *add(int a,int b){
int *sum ;
*sum= a + b;
return sum;
}
int main()
{
int *s = add(1 , 2);
printf("%d\n",*s);
return 0;
}
#include#includeint *add(int a,int b){
int *sum = malloc(sizeof(int));
if(sum == NULL){
printf("malloc error\n");
exit(1);
}
*sum= a + b;
return sum;
}
int main()
{
int *s = malloc(sizeof(int));
if( s == NULL){
printf("malloc error\n");
exit(1);
}
s = add(1 , 2);
printf("%d\n",*s);
free(s);
s =NULL;
return 0;
}
个人觉得这种方式并不好,因为在该被调函数内malloc的空间没有进行free,尽管操作系统会自动释放栈空间的作为函数局部变量的sum指针,因此在被调函数内free(sum),主函数内对free(s),对同一堆空间地址free俩次会出错误。但个人还是更加建议使用将指针作为参数传给被调函数的方式。
#include#includeint *add(int a,int b, int * const sum){
*sum= a + b;
return sum;
}
void *add_test(int a,int b,int * const sum){
*sum = a + b;
}
int main()
{
int *s = malloc(sizeof(int));
if(s == NULL){
printf("malloc error");
exit(1);
}
add_test(1 , 2, s);
printf("%d\n",*s);
free(s);
s =NULL;
return 0;
}
3、常见的内存错误1、内存没有分配成功,却使用了它。
解决办法:在使用指针前一定要确保指针是有效的。对于使用malloc申请的指针,使用if(p ==NULL)检验指针有效性。
2、内存虽然分配成功,但是并未初始化就使用它。
3、内存越界
4、忘记释放内存,造成内存泄漏
1)动态内存申请没有释放
2)多进程情况下,进程结束没有进行资源回收
3)网络通信中,创建了socket套接字但没有释放
4)打开的文件描述符没有释放
内存泄露简单的讲就是申请了一块内存空间,使用完毕后却没有释放掉。一般表现方式是随着程序运行时间越长,占用内存越多,最后虚拟内存空间用尽,程序奔溃。
5、释放了内存却继续使用它。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧