【问题标题】:Noobie void pointer confusionNoobie void 指针混淆
【发布时间】:2012-10-15 10:47:50
【问题描述】:

对于这个 Noobie 问题,我很抱歉,我无法使以下任何一个代码工作?

sn-p 1:

int main(void) {
    void *ptr;
    *ptr = 1;
    printf("%d", *ptr);
    return 0;
}

sn-p 2:

int main(void) {
    void *ptr;
    int a = 1;
    ptr = &a;
    printf("%d", *ptr);
    return 0;
}

sn-p 3:

int main(void) {
    void *ptr;
    int a = 1;
    (int*)ptr = &a;
    printf("%d", *ptr);
    return 0;
}

有什么想法吗?

【问题讨论】:

    标签: c void-pointers


    【解决方案1】:

    Snippet 1
    您不能取消引用 void 指针。
    Snippet 2
    同样的错误。
    Snippet 3
    *(int*)ptr = &a; 不需要。 void 指针可以保存任何类型的指针的地址。

    如果你想使用 void 指针,你可以这样做
    void *p;
    int a=5;
    int *i_ptr = NULL;
    p = &a
    i_ptr = p
    @987654330 @

    在这里,您将地址从 void 指针复制到整数指针。但是您必须确保 p 包含指向 int 的指针的地址,以便进行正确的类型转换。

    【讨论】:

    • +1 用于指出我遇到的所有问题。所以 void 指针仍然不能取消引用,即使在类型转换之后。我说的对吗?
    【解决方案2】:

    你可以像这样(在 sn-p 3 中)对指针进行类型转换

    printf("%d",*(int*)ptr);

    在所有 3 个 sn-ps 中,您都在取消引用 void 指针。这是标准不允许的(或者是未定义的行为,我不记得了)。

    【讨论】:

      【解决方案3】:

      片段 1 没有任何意义。您试图将某些东西存储到“虚空”中,这是不可能的。

      代码段 2 是有道理的,但由于您不能获取“指向 void 的指针”的内容,因此不能使用 *ptr。相反,将其转换为指向 int 的指针,然后获取它的内容。 printf("%d", *(int*)ptr);

      片段 3 没有任何意义,类型转换不是有效的 C 语法。除此之外,它和sn-p 2有同样的问题。

      【讨论】:

        【解决方案4】:

        取消引用void 指针是undefined behaviour

        你应该试试这个

        ptr=(int*)&a;
        

        创建一个int类型的指针

        然后将这个ptr分配给那个,你可以取消引用那个指针

        int *p;
        p=ptr;
        printf("%d",*p);
        

        【讨论】:

        • 感谢您的快速回复,无论如何可以将类型转换运算符放在 void 指针的左侧,例如 sn-p 3 显示 *(int *)ptr = 1;
        • 你必须像我提到的那样使用..但你仍然不能在 printf 中使用 *ptr... 因为它也取消引用 void 指针...
        • @yozloy- 这样做的目的是什么?
        • 在这种情况下,您必须无论如何转换它以供您使用
        • ptr=(int*)&a; 这个强制转换没有任何作用,因为 void 指针可以在没有强制转换的情况下转换为任何其他指针类型。当你写 p=ptr 时,你做的更远。
        猜你喜欢
        • 1970-01-01
        • 2010-09-25
        • 2011-09-04
        • 2016-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多