正在修改cpp中的void指针

Modifying void pointer in cpp

本文关键字:void 指针 中的 cpp 修改      更新时间:2023-10-16

std::fread:的语法

size_t fread(void*ptr,size_t size,size_tcount,FILE*stream);

我们可以用一个字符指针调用std::fread,并用相同的字符指针获取读取的数据。例如:

char* data;
fread(data,5,10,file);

我尝试创建一个类似的函数,它接受字符指针作为void*指针。

#include <iostream>
#include<string.h>
using namespace std;
void modify(void* ptr)
{
char* temp = new char[50];
strcpy(temp,"testing");
__ptr=(void*)temp;
std::cout<<"__ptr="<<(char*)__ptr<<endl;
}
int main()
{
char* str;
modify(str);
cout<<"str="<<str;
return 0;
}

我用尝试了上面的代码http://www.compileonline.com/compile_cpp11_online.php我得到了的输出

__ptr=测试

str=

(a)为什么str没有打印字符串"testing"?

我正在将一个动态分配的变量的地址分配给ptr。因此,即使在控件从方法返回之后,值"testing"也必须在堆中可用

(b)我如何修改函数以便获得输出

__ptr=测试

str=测试

但功能原型不能修改。

请帮忙。

希望问题清楚。

问题是函数modify()引用了void*,但实际上传递的是char*。这不是有效的C++,不应进行编译。

也就是说,有一些旧的C++编译器(Visual C++6?)有一种扩展,允许您这样做。也就是说,当您调用modify(str)时,编译器将创建一个类型为void*的临时值,并将其初始化为str的值。然后将临时内存传递给函数,并获取所分配内存的地址。但是,很明显,str的原始值从未被修改,因此它仍然未初始化。

这就是为什么最初的C++规则禁止这样做的主要原因:保护你免受这种错误的影响。

您有两种解决方案:

  • 用正确的指针类型声明函数:void modify(char*& ptr)
  • 更改编译器
  • 如果你真的想要这个函数,你可以用modify(reinterpret_cast<void*&>(str))来调用它,但我不建议这样做

顺便说一句,永远不要用两个下划线(__ptr)来命名您的标识符。这些名称仅为编译器编写器保留。·

啊!我现在理解了OP问题:他的想法是为fread编写一个包装器,该包装器分配内存,从文件中读取内存并返回指针。如果你只是以通常的方式返回指针,会更容易。使用modify()简化示例:

void* modify()
{
char* temp = new char[50];
strcpy(temp,"testing");
return temp;    
}

然后,称之为:

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

根据@rodrigo的宝贵回答和评论,我解决了我的问题。我修改了函数。

void modify(void* ptr)
{
char* temp;
temp = (char *)ptr;
strcpy(temp,"testing");
}

这解决了所有的问题!