如何通过函数修改指向void的指针?

Lew*_*wis 1 c pointers void void-pointers

我正在尝试创建一个链接列表,您可以在其中更新节点中的数据,但无论我尝试什么,C似乎都不允许我更新void指针的值(或者更确切地说它指向的位置) .这是我的测试代码:

void newData(void * d)
{
    char data[] = "world";

    d = &data;
}

int main()
{
        char testData[] = "hello";
        void * testPointer = &testData;

        printf("TestData is %s\n", (char *)testPointer);

        // Modify the data
        newData(&testPointer);

        printf("TestData is %s\n", (char *)testPointer);
}
Run Code Online (Sandbox Code Playgroud)

哪个只是输出::

TestData is hello
TestData is hello
Run Code Online (Sandbox Code Playgroud)

我错过了一些明显的东西吗?我也尝试使用指针指针,但无济于事.

ASh*_*lly 7

我想你需要

void newData(void ** d) 
{
    char data[] = "world";
    *d = &data;  
}     
Run Code Online (Sandbox Code Playgroud)

但是,这有它自己的问题,因为"world"是堆栈本地的,并且从newData返回后将无效.

  • 虽然,我认为如果将其改为const char*data ="world",它会起作用; 因为"世界"将是二进制文件中的硬编码字符串. (2认同)
  • @Lewis:没有字符串"inside"测试指针.C风格的字符串不能像那样工作.C风格的字符串本质上是指向某些字符序列的第一个字符的指针.所以这个字符序列必须以某种方式存在.将文字指定给char指针(`char*data ="world"`)时,包含`"world\0"`的char序列由编译器隐式创建,并存储在程序数据中.因此,赋值只是将先前分配的数据的地址分配给变量. (2认同)