如何通过引用传递void指针并修改其指向为NULL
解决方案
要实现用void*作为函数参数,同时在函数内部修改原指针变量的值(比如设为NULL),本质还是要借助传递指针变量的地址来实现,只是需要对类型做强制转换适配void*参数。
修改后的代码
#include <stdio.h> #include <unistd.h> #include <sys/mman.h> void myFree(void* freeMemoryPointer){ // 将void*转回void**,直接操作原指针变量的内存 *(void**)freeMemoryPointer = NULL; } int main(){ void *memory1 = mmap(NULL, getpagesize() , PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); printf("\nCurrent pointer: %p\n", memory1); // 传入指针变量的地址,强制转为void*类型 myFree((void*)&memory1); printf("\nShould show null: %p\n", memory1); }
原理说明
- C语言是值传递,如果直接传
memory1,函数里拿到的只是原指针的副本,修改副本不会影响外部的原变量。 - 把
&memory1(原指针变量的地址)强制转为void*传入函数,函数内部再将这个void*转回void**,此时解引用就能直接修改原指针变量的内存值,从而将其设为NULL。
注意事项
- 必须确保传入
myFree的是指针变量的地址,如果传入普通变量的地址或无效内存地址,会触发未定义行为,导致程序崩溃或异常。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

