C语言 如何参照传递void指针

pkmbmrz7  于 2023-01-04  发布在  其他
关注(0)|答案(2)|浏览(138)

我想将void*作为函数参数,然后在函数内部修改该指针(将其更改为NULL)。
下面的代码在函数调用后没有将memory1更改为null。我该如何更改呢?

#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>

void myFree(void**freeMemoryPointer){
    /*some code*/
    *freeMemoryPointer=NULL;
}

int main(){
    void *memory1 = mmap(NULL, getpagesize() , PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);//example
    printf("\nCurrent pointer: %p\n", memory1);
    myFree(memory1);
    printf("\nShould show null: %p\n", memory1);
}

我也试过这个方法,效果很好:

myFree((void*)&memory1);

但是,我需要将void*设置为函数参数,而不是(void*)&void*

ubof19bj

ubof19bj1#

正如问题所陈述的,这在C中是不可能的。
传递指针memory1的值传递了指针的一个副本,函数可以使用它来访问memory1所指向的任何东西,但是它无法改变memory1本身,为此,函数需要一个指向memory1的指针,即&memory1

bfrts1fy

bfrts1fy2#

您可以将指针传递给指针以修改它。

void myFree(void**freeMemoryPointer){
    /*some code*/
    *freeMemoryPointer=NULL;
}

int main(void){
    void *memory1 = mmap(NULL, getpagesize() , PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);//example
    printf("\nCurrent pointer: %p\n", memory1);
    myFree(&memory1);
    printf("\nShould show null: %p\n", memory1);
}

在C和C++中编译而不发出警告并正确执行(https://godbolt.org/z/fPxfY1YEPhttps://godbolt.org/z/8razoT9MT

相关问题