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