【问题标题】:char pointer and static_cast in c++ code related to virtualalloc与virtualalloc相关的c ++代码中的char指针和static_cast
【发布时间】:2022-01-19 13:10:33
【问题描述】:

我在搜索一些与 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);

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

【问题讨论】:

  • 因为 C++ 和 C 是不同的语言。在 C 中,void * 可以自动转换为任何指针类型,因为动态分配使用mallocfree。在 C++ 中,动态分配使用 newdelete,通常不需要指针转换,因此必须明确地转换为 void *

标签: c++ memory


【解决方案1】:

更简单的例子:

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* 时,类型系统被绕过,并且在很大程度上取决于您知道该指针实际指向什么或它可以用于什么。

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 2021-11-26
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 2017-11-30
    • 1970-01-01
    • 2017-03-30
    相关资源
    最近更新 更多