繁体   English   中英

修改cpp中的void指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM