C++如何从函数返回和收集地址
C++ how to return and collect an address from a function
我需要使用什么返回和变量类型来捕获传递给函数的变量地址的返回值?
说:
RETURNTYPE get_address(int num){
return #
}
int main(){
int num = 1;
DATATYPE = get_address(num);
return 0;
}
RETURNTYPE 和 DATATYPE 应该是int*
的,但请注意,返回指向函数参数的指针没有多大意义。
参数仅在函数执行期间存在。一旦函数返回,该变量就不再存在,并且使用返回的地址本质上是未定义的行为。
如果您希望在调用站点将变量的地址用作参数,那么您根本不需要函数get_address()
,只需使用 &
运算符:
int main(){
int num = 1;
int* pnum = #
return 0;
}
如果您有权访问 C++11,则可以使用内置的 std::addressof。
您可以实现一个泛型函数,该函数返回参数的地址,如下所示:
template<typename T>
T* addr(T& param)
{
return (T*)&(char&)param;
}
(这是 C++11 实现,之所以这样,是因为一元&
可能会过载)
请注意,必须通过引用传递参数,否则将返回局部变量的地址,这可能会导致未定义的行为。
或者您可以简单地使用 &
. :)
我只需要验证 num 上的地址在按值传递时在函数内部和外部是否不同。
您可以按值和引用传递相同的参数:
void compareAddresses(int passedByValue, int& passedByReference)
{
std::cout << &passedByValue << " " << &passedByReference;
}
指针是保存地址的变量。所以你需要指向 int 的指针。
int* get_address (int num) {
return #
}
int main () {
int num = 1;
int* pointer = get_address(num);
return 0;
}
上面当然是行不通的,因为你通过复制传递值,变量将从堆栈中释放,指针将失效。
如果你需要一个函数,你应该通过引用传递它(这将返回变量的正确指针地址):
int* get_address (int &num) {
return #
}
虽然你不需要函数。这有点过分。这工作得很好:
int* pointer = #
你不能,或者更确切地说,我应该说你不应该返回局部作用域变量的地址,因为它们在函数返回后不再存在。因此,你得到的只是垃圾。
int num = 1;
int* addr = #
在 C++11 中,当您不知道类型时,可以使用 auto,但不能从函数返回 auto。
auto num = 1;
auto addr = #
函数完成后,局部变量将被销毁。函数调用可能会被其他函数调用覆盖。你不会得到你想要的。因此,不应返回指向函数局部变量的指针。
- 从 C++ 中的函数返回数组地址问题
- inet_ntop返回不存在的地址
- 为什么下面的代码段返回指针指向的值而不是指针的地址?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 为什么按值返回的对象与方法中的对象具有相同的地址?
- 返回数组中值的指针地址
- 创建一个函数来转换数组元素的类型并返回数组的地址
- 返回地址上的WriteProcessMemory
- 指针地址的内存偶尔更改了函数前和后返回
- libmysql:警告:返回局部变量"行"的地址(C++/C)
- 在字符串函数的指针中返回地址
- 在C++中为零大小的分配返回唯一地址背后的基本原理是什么?
- 重载新返回错误的地址
- 为什么 C++ 中的字符数组返回其项目而不是地址?
- 为什么 c_str() 在返回常量指针值时不输出地址
- 英特尔 Pin:如何获取系统调用的返回地址
- 按价值和地址返回
- ReadProcessMemory()为静态地址返回0
- 访问存储在指针变量所指向的地址中的值(这是一个地址)返回垃圾值
- 将地址返回给局部变量与返回指向局部变量的指针