[英]Modifying void pointer in cpp
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 =测试
但是功能原型无法修改。
请帮忙。
希望问题清楚。
问题在于函数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");
}
这样就解决了所有问题!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.