与virtualalloc相关的c ++代码中的char指针和static_cast

char pointer and static_cast in c++ code related to virtualalloc

我在搜索一些与 VirtualAlloc 相关的代码时遇到了这段代码:

#include<windows.h>  
#include<iostream>
using namespace std; 

int main() {
size_t in_num_of_bytes,i;
cout<<"Please enter the number of bytes you want to allocate:";
cin>>in_num_of_bytes;                                      

LPVOID ptr = VirtualAlloc(NULL,in_num_of_bytes,MEM_RESERVE | MEM_COMMIT,PAGE_READWRITE); //reserving and commiting memory

if(ptr){
    char* char_ptr = static_cast<char*>(ptr);
    for(i=0;i<in_num_of_bytes;i++){ //write to memory
        char_ptr[i] = 'a';
    }

    for(i=0;i<in_num_of_bytes;i++){ //print memory contents
        cout<<char_ptr[i];
    }

    VirtualFree(ptr, 0, MEM_RELEASE); //releasing memory    
}else{
    cout<<"[ERROR]:Could not allocate "<<in_num_of_bytes<<" bytes of memory"<<endl; 
}

return 0;
}

这是一段我试图理解的代码。但是,我对以下行感到困惑:

char* char_ptr = static_cast<char*>(ptr);

我不确定为什么需要这一行。它有什么作用?

更简单的例子:

void* allocate_some_stuff(){
    return new char[42];
}

int main()
{
    void* ptr = allocate_some_stuff();
    char* cptr = ptr;
}

因为 C++ 不允许从 void*char* 的隐式转换,所以导致错误:

<source>:9:18: error: invalid conversion from 'void*' to 'char*' [-fpermissive]
    9 |     char* cptr = ptr;
      |                  ^~~
      |                  |
      |                  void*

但是当你显式转换时没问题:

int main()
{
    void* ptr = allocate_some_stuff();
    char* cptr = static_cast<char*>(ptr);
}

void* 可以指向(几乎)任何地方并且转换为 char* 通常是可以的(char 是一个例外)。在处理 void* 时,类型系统被绕过,并且在很大程度上取决于您知道该指针实际指向什么或它可以用于什么。