【问题标题】:C Void pointer as an argumentC void 指针作为参数
【发布时间】:2012-11-27 03:18:34
【问题描述】:

我试图通过地址传递一些东西。在这种情况下是一个 char 数组,但它可以是任何东西。

void rickyHashTableAdd(rickyHashTable *table, char *key, void *value)
{
    rickyHashTableEntry entry;
    entry.key = strdup(key);    
    entry.value = value;
    table->entries[0] = entry;
}

int rickyHashTableGet(rickyHashTable *table, char *key, void *value)
{
    value = table->entries[0].value;
}

int main (void) 
{       
    void *val;
    val = "what up";
    rickyHashTableAdd(&symbolTable, "ok", val);
    void *val2;
    rickyHashTableGet(&symbolTable, "ok", val2);
    printf("result: %s\n", val2);   

}

当我在 rickyHashTableGet 函数中检查“value”的值时,它是正确的,但是当我在调用函数后签入 main 时,它就很糟糕。它似乎没有设置为正确的内存地址。这是为什么呢?

【问题讨论】:

  • 您必须先将val2 设置为某种值,然后才能将其传递给rickyHashTableGet!此外,rickyHashTableGetvalue 设置为某物,然后将其丢弃。你想退货吗?还是你想传递一个指向它的指针而不是按值传递它?

标签: c pointers void-pointers memory-address


【解决方案1】:
int rickyHashTableGet(rickyHashTable *table, char *key, void *value)
{
    value = table->entries[0].value;
}

这将忽略传递的value。将 value 设置为某物,然后将其丢弃。这不可能。

void *val2;
rickyHashTableGet(&symbolTable, "ok", val2);

这不会将val2 设置为任何值,因此会将一个无意义的值传递给rickyHashTableGet。这不可能。

你想要:

int rickyHashTableGet(rickyHashTable *table, char *key, void **value)
{
    *value = table->entries[0].value;
}

这需要一个指向void * 的指针并使其指向某个东西。

还有:

void *val2;
rickyHashTableGet(&symbolTable, "ok", &val2);

这会将val2地址传递给rickyHashTableGet,所以它可以设置它的值。

【讨论】:

    【解决方案2】:

    在你的 get 例程中,它应该是 void **get 作为参数和 *value = table->entries[0].value;然后调用将使用 &val2。

    【讨论】:

      猜你喜欢
      • 2016-01-11
      • 2012-09-09
      • 2016-05-03
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 2020-06-11
      • 2011-07-31
      • 2020-12-31
      相关资源
      最近更新 更多