函数参数中的void指针

Des*_*tor 1 c++ pointers parameter-passing void-pointers

考虑以下计划:

#include <iostream>
void f(void* a)
{
    std::cout<<"(void*)fun is called\n";
    std::cout<<*(int*)a<<'\n';
}
int main()
{
    int a=9;
    void* b=(int*)&a;
    f(b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我像这样更改函数调用语句:

f(&b);

它仍然可以在运行时编译精细和崩溃.为什么?是什么原因?我不应该得到编译时错误吗?因为调用函数的正确方法是f(b).对?另外,为什么允许将NULL传递给参数类型为(void*)的函数?

如果我遗漏了某些东西或者对错误的理解,请纠正我.

Dre*_*ann 7

它仍然可以在运行时编译精细和崩溃.为什么?是什么原因?

因为这void*是一种删除所有类型安全和类型检查的技术.

我不应该得到编译时错误吗?

通过使用void*而不是正确的指针类型int*,您明确告诉编译器不要告诉您是否正在使用类型错误或以未定义的方式.

因为调用函数的正确方法是f(b).对?

这就是你的功能声明内容不同意的地方.

    std::cout<<"(void*)fun is called\n";
    std::cout<<*(int*)a<<'\n';
Run Code Online (Sandbox Code Playgroud)

上面的内容暗示int应该传递指针:

void f(void* a)
Run Code Online (Sandbox Code Playgroud)

声明意味着应该传递一些指针,并且不会进行其他限制.