我有以下结构:
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 ?
-
我的 pa 的生活时间是什么时候?我可以在 process_a() 函数之外可靠地使用该指针吗?
谢谢!伊戈尔 .
2 回答
是的,但它仅在结构的生命周期内有效 .
从函数返回的结构是一个临时对象,它会立即被销毁 .
将有一些空间,可能是"on the stack",用于将结果返回到的函数 .
一旦执行了赋值的右侧,结构就不会存储在任何地方,因为它不存在 .
几乎可以肯定为整个结构分配空间 .
pa
的生命周期是process_a
的主体,但*pa
的生命周期已过期,如上所述 .因此,即使在
process_a
内,也不能将pa
的值用于任何内容(复制除外) .您的代码似乎运行正常,因为“似乎运行正常”是一种有效的未定义行为形式,就像任何事情一样 .
是的,可以指定一个结构内部字段的指针 .
foo
正在堆叠中像你说的
pa
的生命周期就像任何局部变量一样 - 直到func结束 . 您可以't use it beyond the func scope. However, you have a different problem here - the return value of get_foo is temporary and once you'重新超出分配给pa
的范围,它可以得到解除了分配,因此任何通过pa
后指出会导致不确定的行为数据的使用 .