访问由空指针引用的内存 我在C++中找到了空洞指针,并且作为练习,编写了以下代码: void* routine(void* number){ int n = (int)number; int* np = (int*)number; cout<<"void pointer: "<<number<<endl; cout<<"casted int pointer: "<<np<<endl; cout<<"int pointer content: "<<*np<<endl; return (void*)NULL; } int main(){ int num = 1; routine((void*)num); } void*例程(void*编号){ int n=(int)个数; int*np=(int*)数; coutvoid*例程(void*编号){ int n=(int)个数; int*np=(int*)数; coutvoid*例程(void*编号){ int n=(int)个数; int*np=(int*)数; cout

访问由空指针引用的内存 我在C++中找到了空洞指针,并且作为练习,编写了以下代码: void* routine(void* number){ int n = (int)number; int* np = (int*)number; cout<<"void pointer: "<<number<<endl; cout<<"casted int pointer: "<<np<<endl; cout<<"int pointer content: "<<*np<<endl; return (void*)NULL; } int main(){ int num = 1; routine((void*)num); } void*例程(void*编号){ int n=(int)个数; int*np=(int*)数; coutvoid*例程(void*编号){ int n=(int)个数; int*np=(int*)数; coutvoid*例程(void*编号){ int n=(int)个数; int*np=(int*)数; cout,c++,shared-memory,void-pointers,pointer-arithmetic,C++,Shared Memory,Void Pointers,Pointer Arithmetic,通常的&num就可以了 routine(&num); 任何对象指针都会隐式转换为void*。在回调函数上,您必须将其转换回正确的指针类型(使用static\u cast而不是C样式的cast,这将防止您意外地将包含地址的指针与非内存地址的整数值混淆) void*例程(void*用户\u ptr) { int*np=static\u cast(用户\u ptr); 其他非对象指针的指针将不会隐式转换为void*,包括函数指针和指向成员的指针。添加强制转换将迫使编译器执行错误的操作并对

通常的
&num
就可以了

routine(&num);
任何对象指针都会隐式转换为
void*
。在回调函数上,您必须将其转换回正确的指针类型(使用
static\u cast
而不是C样式的cast,这将防止您意外地将包含地址的指针与非内存地址的整数值混淆)

void*例程(void*用户\u ptr)
{
int*np=static\u cast(用户\u ptr);


其他非对象指针的指针将不会隐式转换为
void*
,包括函数指针和指向成员的指针。添加强制转换将迫使编译器执行错误的操作并对此保持沉默,但是(除了返回值
dlsym()
或其Windows等效值
GetProcAddress()
)无论如何,将
void*
与这些其他指针类型混合使用是不安全的。

通常的
&num
就可以了

routine(&num);
任何对象指针都会隐式转换为
void*
。在回调函数上,您必须将其转换回正确的指针类型(使用
static\u cast
而不是C样式的cast,这将防止您意外地将包含地址的指针与非内存地址的整数值混淆)

void*例程(void*用户\u ptr)
{
int*np=static\u cast(用户\u ptr);


其他非对象指针的指针将不会隐式转换为
void*
,包括函数指针和指向成员的指针。添加强制转换将迫使编译器执行错误的操作并对此保持沉默,但是(除了返回值
dlsym()
或其Windows等效值
GetProcAddress()
)无论如何,将
void*
与这些其他指针类型混合使用是不安全的。

routine(&num)
?“我有点认为这不起作用,但如果是这种情况,我也会认为会出现某种编译器错误。”-当你强制执行这些类型的强制转换时,你会从编译器那里夺走很多控制权,并有效地告诉它‘相信我,我知道我在做什么’。因此,如果你的强制转换错误,问题就全在你身上。“我在用C++处理无效指针。”我可以问一下为什么吗?大多数人根本不需要使用它们。但是,是的,你从值
1
而不是它的地址进行了错误的转换,因此我将VTC视为一个打字错误。
“学习需要作废通行证的phtreads”
:尽可能改用。C确实允许您将整数转换为指针,并将指针转换为整数,但由于转换是由实现定义的,因此无法保证最终会得到相同的值。它可能工作正常。您可以使用
intptr\u t
而不是
int
,但即使这样也不能保证开始工作。(从
void*
intptr\t
void*
的往返过程保证指向与初始指针相同的对象,但从
intptr\t
void*
intptr\t
的往返过程不保证以初始数值结束。)
例程(&num)
?“我有点希望这不起作用,但如果是这样的话,我也会期望出现某种编译器错误”-当你强制这样的强制转换时,你会剥夺编译器的很多控制权,并有效地告诉它“相信我,我知道我在做什么”。因此,如果你的转换错误,问题就全在你身上。“我正在思考C++中的无效指针”我可以问一下为什么吗?大多数人不应该使用它们。但是,是的,你从值
1
而不是它的地址进行了错误的转换,因此我将VTC视为一个打字错误。
“学习需要无效通行证的phtreads"
:尽可能改用。C确实允许您将整数转换为指针,并将指针转换为整数,但由于转换是由实现定义的,因此无法保证最终会得到相同的值。它可能工作正常。您可以使用
intptr\u t
而不是
int
,但即使这样也不能保证开始工作。(从
void*
intptr\t
void*
的往返过程保证指向与初始指针相同的对象,但从
intptr\t
void*
intptr\t
的往返过程不保证以初始数值结束。)不要执行不必要的强制转换,它们会阻止编译器告诉您类型安全错误。
num\u p
void*
的转换不需要强制转换。不要执行不必要的强制转换,它们会阻止编译器告诉您类型安全错误。
num\u p
void*
的转换不需要强制转换铸造
void* routine( void* user_ptr )
{
    int* np = static_cast<int*>(user_ptr);