• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

C中的free内存

chownn 2019-03-26 浏览量:636

下面代码中,p申请内存,把p的指针赋给p1,此时释放free(p1),p申请的内存释放释放了?

怎么理解?

void main()

{
char *s = "Hello World";
printf("%s\r\n"s);
unsigned char *p = (unsigned char *)malloc(20);
memset(p020);
memcpy(ps15);
printf("%s\r\n"p);
unsigned char *p1 = p;
printf("befor free p1%s\r\n"p);
free(p1);
p1 = NULL;
printf("end free p1%s\r\n"p);
free(p);
printf("end free p%s\r\n"p);

}
0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 因为平台对代码中逗号处理的原因,所以里面很多部分代码估计有问题,建议用空格代替(隔开些)

    首先,申请内存空间的处理不够标准,

    一般是

    // 下面是申请20个unsigned char 空间的标准方法,这样可以适应不同的平台环境,无论是多少位的系统

    unsigned char *p = (unsigned char *)malloc( 20 * sizeof(ungigned char) );


    此外关于你的free问题是因为p1=p,这里是值赋值,注意,这里的值是特殊的地址值,而不是里面的内容

    free只是一个标志处理过程,表示这个地址对应的内存已经回收,可以用作它处,具体什么时候使用,则是由操作系统和应用程序一起根据需要决定(可能没有需要则还没有被其他程序占用,还会保留原来的信息),而且已经free的内存,理论上不应该去访问,因为这部分内容已经不受控制,很容易出现问题啦。

    所以你的程序处理可能看不到free的效果。


    这也是c程序指针问题麻烦之处,需要合理的管理所用指针相关操作,稍有不慎,就可能让程序崩溃。



    • 发布于 2019-03-26
    • 举报
    • 评论 0
    • 1
    • 0

其他答案 数量:2
  • 这里的malloc和free的对象都是一个内存地址开始的20个byte的区域,只要使用的指针指向这个区域就行,至于它的变量名叫什么不重要,具体的地址值才重要

    这里执行了一个p1 = p,就是一个地址赋值的过程,因此free(p1)效果是一样的

    • 发布于2019-03-26
    • 举报
    • 评论 0
    • 1
    • 0

  • P1 = P意思指针P1指向的地址和指针P的地址是同一个,P1和P是同一个空间,因此没有为P1分配额外的空间。当free(P1)时,P1的空间释放了,P的空间也就释放了。P1又指向了NULL,此时P1的地址为空,P的内容也空了。而P的空间虽然释放了,但P未重新指向NULL,因此P的地址可能还是原来的地址,P指向的内容可能还是原来的内容。
    • 发布于2019-03-26
    • 举报
    • 评论 0
    • 1
    • 0

相关问题

问题达人换一批

C中的free内存