繁体   English   中英

正确取消引用指针

[英]Properly dereferencing pointer

我在用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.cppfoo值,该值通过调用file1.cpp的函数来file1.cpp 当我比较foobar的指针地址时,我发现它们是相同的。 但是,当我想取消对指针的引用时,就会感到虚假。 我怀疑我在取消引用时做错了什么,但是当我将此与代码的其他部分(我自己没有写过)进行比较时,它似乎是有效的。

我知道这应该是非常基本的C ++,但是某种程度上它对我不起作用。 如果有人可以向我解释这是如何正确完成的,我将不胜感激。

马亭

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

如果要从函数返回指针,则需要在免费存储区中为其分配内存,然后返回该指针并记住稍后将其删除:

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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