2016-11-02 169 views
0

片段将id的值传递给采用普通void *结构的例程。我很困惑为什么它的工作原理:为什么你可以投longvoid*并投下回long通过指针将值传递给void

特别是,我在想如果你想通过指针传递,那么你应该把变量的地址如&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); 
} 

回答

4

它的工作原理,因为(您的系统上!)的void*指针本身包含足够的位持有long值的所有位。这不是便携式的。

你是对的,你通常会投long*void*回来。这是便携式。

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); 
} 
+0

这不是打印'foo'值的正确方法。使用'printf(“%p”,(void *)foo);/*更好* /'或'printf(“%ld”,(long)foo);/*更糟* /' – user694733

+0

指针不是“只是数字”。着名的8086“远”指针是_两个数字。 (段/偏移) – MSalters

1

我很困惑,为什么它的工作原理:为什么你可以投长为void *,并用长投回来。

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

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

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

请注意,在你的代码中你永远不会遵从指针,所以事情的工作。如果确实取消引用id中的,则通常会由于内存访问不良而导致段错误。