对不起这个Noobie问题,我只是不能使以下任何一个代码工作?
摘录1:
int main(void) {
void *ptr;
*ptr = 1;
printf("%d", *ptr);
return 0;
}
摘录2:
int main(void) {
void *ptr;
int a = 1;
ptr = &a;
printf("%d", *ptr);
return 0;
}
摘录3:
int main(void) {
void *ptr;
int a = 1;
(int*)ptr = &a;
printf("%d", *ptr);
return 0;
}
任何想法?
答案 0 :(得分:1)
Snippet 1
你无法取消引用空指针
Snippet 2
同样的错误。
Snippet 3
不需要*(int*)ptr = &a;
。 Void指针可以保存任何类型指针的地址。
如果你想使用void指针,可以按照下面的说明进行操作
void *p;
int a=5;
int *i_ptr = NULL;
p = &a
i_ptr = p
printf("\n %d",*i_ptr);
这里是将地址从void指针复制到integert指针。但是你必须确保p包含指向int的指针的地址,以便正确地进行类型转换。
答案 1 :(得分:1)
您可以像这样(在代码段3中)将指针类型转换为
printf("%d",*(int*)ptr);
在所有3个片段中,您将取消引用void指针。这是标准不允许的(或者是未定义的行为,我不记得)。
答案 2 :(得分:1)
Snippet 1没有任何意义。你试图将某些东西存入“虚空”,这是不可能的。
Snippet 2是有道理的,但由于你无法获取“指向空白的指针”的内容,因此无法使用* ptr。相反,将它转换为指向int的指针,然后获取其内容。 printf("%d", *(int*)ptr);
Snippet 3没有任何意义,类型转换是无效的C语法。除此之外,它与代码片段2具有相同的问题。
答案 3 :(得分:0)
解除引用void
指针为undefined behaviour
你应该试试这个
ptr=(int*)&a;
创建一个int
然后将此ptr分配给该ptr,您可以取消引用该指针
int *p;
p=ptr;
printf("%d",*p);