我有以下结构:
struct foo{
int a[4];
int b[4];
}
我有以下功能:
foo get_foo()
{
foo ret_val;
<..some assignments here..>
return ret_val;
}
现在,我的主要代码:
void* process_a()
{
int* pa = get_foo().a;
<..do smth with "pa"..>
return pa;
}
看起来代码运行良好,但完全不知道完整结构会发生什么,因为我只能访问它的一部分。 还有,问题:
- 仅将在堆栈上创建的结构的一部分分配给指针可以吗?
- foo 结构在哪里?在堆栈上?还是堆?
- 编译器是否足够聪明,可以只分配 int[4](这不太可能),还是会分配完整的 foo?
- 我的爸爸的生活时间是什么时候?我可以在 process_a() 函数之外可靠地使用该指针吗?
谢谢! 伊戈尔。
最佳答案
- 是的,但它仅在结构的生命周期内有效。
- 从函数返回的结构是一个临时对象,它会立即被销毁。
将有一些空间,可能是“在堆栈上”,供函数将其结果返回到其中。
一旦右侧的赋值执行完毕,该结构就不会存储在任何地方,因为它不存在。 - 它几乎肯定会为整个结构分配空间。
pa
的生命周期是process_a
的主体,但是*pa
的生命周期已经过期,如上所述。
因此,您不能将pa
的值用于任何事情(复制它除外),即使是 insideprocess_a
。
您的代码似乎运行良好,因为“似乎运行良好”是未定义行为的有效形式,就像其他任何事情一样。
关于c++仅分配函数调用返回的结构的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30529888/