该代码段将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);
}
答案 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
,那通常会因内存访问不良而导致段错误。