首页 > 其他分享 >C语言 通过union共存体释放常量指针指向的堆空间

C语言 通过union共存体释放常量指针指向的堆空间

时间:2023-10-15 10:46:12浏览次数:30  
标签:const union 共存 void free C语言 cp ptr

union共存体中所有成员占用相同的内存空间。
因为free函数参数是void *,常量指针是const void *,所以free函数释放常量指针时会因类型不同而失败。

#include <stdio.h>
#include <malloc.h>
#include <string.h>

typedef union _const_ptr
{
    const void *cp;
    void *vp;
} const_ptr;

void free_const_ptr(const void *cp)
{
    if (!cp)
    {
        return;
    }

    const_ptr ptr = {.cp = cp};
    free(ptr.vp);
}

int main()
{
    char a[20] = "123";
    const char *b = strdup(a);
    printf("%s\n", b);
    // free(b);
    free_const_ptr(b);
    return 0;
}

 

标签:const,union,共存,void,free,C语言,cp,ptr
From: https://www.cnblogs.com/WJQ2017/p/17765335.html

相关文章

  • C语言 strdup函数把字符串复制到新空间
    头文件是string.h。根据传入的字符串参数,malloc分配空间并复制,返回首地址,该地址通过free来释放。#include<stdio.h>#include<malloc.h>#include<string.h>intmain(){chara[20]="123";char*b=strdup(a);printf("%s\n",b);free(b);......
  • C语言 likely和unlikely
    likely和unlikely作用在知道哪个发生概率更高的情况下,有if时使用likely和unlikely让代码运行更快。likely和unlikely是两个宏,当有if-else分支时告诉编译器,哪个条件更加有可能发生。likely代表if分支大概率会发生,unlikely代表if分支大概率不会发生。#definelikely(x)__builtin_......
  • 学习C语言心得-自定义函数-每调用一次函数 num的值+1
    每调用一次函数num的值+1#include<stdio.h>NUM(int*num){ (*num)++;}intmain(){ intnum=0; NUM(&num); printf("%d\n",num); NUM(&num); printf("%d\n",num); NUM(&num); printf("%d\n",num); NUM(&num)......
  • 学习C语言心得-嵌套函数-最简单的嵌套调用
    嵌套调用#include<stdio.h>firet(){ printf("hehe\n");}second(){ inti=0; for(i=0;i<3;i++) { firet(); }}intmain(){ second(); return0;}运行结果:......
  • 学习C语言心得-自定义函数-对整形有序数组进行二分查找-二分法
    对整形有序数组进行二分查找#include<stdio.h>intfind(intarr[],intsz,intk){ intleft=0;intright=sz-1; while(left<=right) { intmid=left+right/2; if(k>arr[mid]) { left=mid+1; } if(k<arr[mid]) { right=mid......
  • 初识C语言
    什么是C语言?C语言是一门通用计算机编程语言,广泛应用于底层开发。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言是一门面向过程的计算机编程语言,与C++,Java等面向对象的编程语言有所不同。......
  • C语言预处理和宏
    C语言预处理和宏预处理命令预处理是C语言的一个重要功能,由预处理程序完成。当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。这些在编译之前对源文件进行简单加工的过程,就称为预处理。预处理阶段的工作:把代码当......
  • 萌新学习c语言记录
    今天写的题要求使用while语句发现输出一直循环一直循环着最后一个数然后看别人的答案发现要这样做然后我搜索了一下发现while(scanf("%d",&a)!=EOF)可以检查输入是否成功如果不输入的话将不会进行下一步......
  • 学习C语言心得-自定义函数 输入两个数字求和
    输入两个数字求和#include<stdio.h>intsum(inta,intb){ returna+b;}intmain(){ inta=0; intb=0; printf("请输入ab的值:"); scanf("%d%d",&a,&b); intSum=sum(a,b); printf("Sum=%d",Sum); return0;}运行......
  • 学习C语言心得-传址调用
    运用传址调用来交换两个数#include<stdio.h>inttransform(int*a,int*b){ intx=0; x=*a; *a=*b; *b=x;}intmain(){ inta=10; intb=20; printf("交换前:%d%d\n",a,b); transform(&a,&b); printf("交换后:%d%d\n",......