gpt4 book ai didi

c++ - 修改cpp中的void指针

转载 作者:行者123 更新时间:2023-11-30 01:18:55 24 4
gpt4 key购买 nike

std::fread 的语法:

size_t fread (void * ptr, size_t size, size_t count, 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=测试

但是不能修改函数原型(prototype)。

请帮忙。

希望问题清楚。

最佳答案

问题是函数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());

关于c++ - 修改cpp中的void指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21797166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com