正在修改cpp中的void指针
Modifying void pointer in cpp
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");
}
这解决了所有的问题!
- 如何在 C++ 中将 void 函数传递给 void 指针
- 将通用引用强制转换为可调用的 void 指针,反之亦然
- C++为 void 指针分配一个字符串
- 为什么在将 void 指针转换为整数指针时出现分段错误
- 取消引用 void 指针以将值分配给结构
- C 与 C++,处理 void** 指针
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 用非零值初始化void指针的正确(或最安全)方法
- 将 void 指针分配给另一个 void 指针
- c ++ 我是否需要手动删除指向另一个具体类型的 void* 指针?
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 如何将 std::string 赋回作为 <char>void* 指针传递的 std::vector.data()?
- 将指针传递到结构,与传递 void 指针并强制转换为结构
- 如何在void*指针下检查运行时类型(允许简单类型,没有基类)?
- 用于初始化结构的 void 指针强制转换
- 使用 void 指针:void **ptr.. 如何修改共享内存的值?
- 访问由 void 指针引用的结构的成员
- 你不能在 void 指针上使用指针算法,那么 void 指针数组是如何工作的呢?
- 如何警告 C 中 void 指针上的参数不兼容的类型
- 指向类模板方法的 void 指针的向量