前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c-free()方法

c-free()方法

作者头像
kdyonly
发布2023-03-03 19:20:48
3020
发布2023-03-03 19:20:48
举报
文章被收录于专栏:个人编程笔记个人编程笔记

浏览量 1

Q:以下代码,当用户输入’freeze’时会崩溃,而如果输入’zebra’则运行正常,为什么?

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int main(int argc, char *argv[])
{
    //分配内存空间
   char *ptr = (char *)malloc(10);
   if (NULL == ptr){
       return -1;
   }
   if (argc == 1){
       printf("\n Usage: add a string \n");
   }else {
        //初始化,将已开辟内存空间 ptr 的首 n(这里n=10)个字节的值设为值 0
        memset(ptr, 0, 10);
        strncpy(ptr, argv[1], 9);
        while (*ptr != 'z'){
           if (*ptr == ' ') break;
           else ptr++;
       }
       if (*ptr == 'z'){
           printf("\n String contains 'z' \n");
           //Do some more processing
       }
        //释放内存空间
       free(ptr);
   }
   return 0;
}

A:问题的根源是因为代码在while循环中改变了 ptr 指针的地址。当输入为’zebra’时,while循环甚至在执行第一遍前就结束了,所以free()释放的内存地址就是一开始malloc()分配的地址。但是当输入’freeze’时, ptr记录的地址在while循环中被更改,因此将会使错误的地址传递到free()方法中引起崩溃。 注意:调用free()方法释放内存时,参数必须要么是NULL,要么是先前从malloc/calloc或者realloc返回的地址,不能将一次动态申请的内存的部分释放。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档