通过指针将值传递给void

时间:2016-11-02 11:28:00

标签: c

该代码段将id的值传递给采用通用void *结构的例程。我很困惑为什么它的工作原理:为什么你可以将long转换为void*并用long强制转换它。

特别是,我在考虑是否要通过指针传递,然后您应该将变量的地址(例如&id)传递给test()函数。

#include <stdio.h>

void test(void * id) {
    long myid;
    myid = (long) id;
    printf("my id is %ld\n", myid);
}

int main() {
    long id = 5;
    test( (void *)id);
}

3 个答案:

答案 0 :(得分:4)

它有效,因为(在你的系统上!)void*指针本身包含足够的位来保存long值的所有位。这不便携。

你是正确的,你通常会将long*投射到void*并返回。这是便携式的。

答案 1 :(得分:1)

它有效,因为指针只是数字。

您的测试功能“认为”它收到了指向内存位置5的指针,您当然可以打印此地址。您将无法为此位置分配任何内容,因此* myid = 42会导致分段错误。将数字转换为指针在语法上是正确的,因此编译器不会呻吟,但它没有任何意义。运行此代码并查看指针在打印时的外观(忽略编译器的警告)。

#include <stdio.h>

void test(void *id, long *foo) {
    long myid;
    myid = (long) id;
    printf("my id is %ld, %ld\n", myid, foo);
}

int main() {
    long id = 5;
    long foo;
    foo = 42;
    test( (void *)id, &foo);
}

答案 2 :(得分:1)

  

我很困惑为什么它会起作用:为什么你可以将长时间转换为无效*并将它转回去。

long id = 5;
test( (void *)id);

这实际上是有效的。你基本上是指将void指针传递给函数test,该指针保存5的地址。

void test(void * id)中,您将指针转回long,这也是有效的。

请注意,在您的代码中,您永远不会遵循指针,因此事情可行。如果你取消引用id中的指针test,那通常会因内存访问不良而导致段错误。