gpt4 book ai didi

c++ - 正确取消引用指针

转载 作者:行者123 更新时间:2023-11-27 22:58:45 24 4
gpt4 key购买 nike

我正在努力处理一段 C++ 代码中的指针。事不宜迟,让我向您展示我的部分代码:

file1.cpp

void *SomeClass::extract()
{
double foo = 3.14;
return (void*) &foo; // returns the pointer to a double
}

file2.cpp

void * bar = SomeClass->extract(); // fetches the pointer to a double
fprintf(screen, "pointer address: %p \t value: %.3e \n", bar, (double*) bar);

(由于代码的大量过度简化,可能存在不一致。)我基本上想做的是在 file2.cpp 中打印出 foo 的值,通过调用 file1.cpp 中的函数检索。当我比较foobar 的指针地址时,我发现它们是相同的。但是当我想取消引用指针时,我就弄错了。我怀疑我在取消引用时做错了什么,但是当我将它与代码的其他部分(顺便说一句,我自己没有写)进行比较时,它似乎是有效的。

我知道这应该是非常基础的 C++,但不知何故它对我不起作用。如果有人能向我解释这是如何正确完成的,我将不胜感激。

马丁

最佳答案

您正试图返回一个指向自动变量的指针,该变量将在 extract 函数退出后立即销毁。然后您尝试取消引用指向无效对象的指针,这是未定义的行为。

如果你想从一个函数中返回一个指针,你需要在free store上为它分配内存,然后返回指针并记得稍后删除它:

double *SomeClass::extract()
{
double *foo = new double(3.14);
return foo;
}

然后要获取此指针的值,您需要取消引用它:

double * bar = SomeClass->extract(); // fetches the pointer to a double
fprintf(screen, "pointer address: %p \t value: %.3e \n", bar, *bar);

或者,如果您出于某种原因坚持使用 void*,请确保取消引用指针转换的结果:

void * bar = SomeClass->extract(); // fetches the pointer to a double
fprintf(screen, "pointer address: %p \t value: %.3e \n", bar, *(double*) bar);
// here ^

但是,double 等内置类型设计为按值传递,因此您通常不应动态分配它们。

double SomeClass::extract()
{
return 3.14;
}

关于c++ - 正确取消引用指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29801083/

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