Noobie无效指针混乱

时间:2012-10-25 09:21:29

标签: c void-pointers

对不起这个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;
}

任何想法?

4 个答案:

答案 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);