c ++仅分配函数调用返回的结构的一部分
c++ assigning only part of struct returned by function call
我有以下结构:
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() 函数之外可靠地使用该指针吗?
谢谢!
伊戈尔.
- 是的,可以将指针分配给结构的内部字段。
foo
在堆栈上
- 就像你说的 - 这不太可能
pa
的生命周期就像任何局部变量一样 - 直到 func 结束。您不能在 func 范围之外使用它。但是,您在这里有一个不同的问题 - get_foo 的 return 值是临时的,一旦您超出了 pa
的分配范围,它就会被释放,因此任何使用之后 pa
指向的数据将导致未定义的行为。
- 是的,但它仅在结构的生命周期内有效。
- 从函数中 return 得到的结构是一个临时对象,它会立即被销毁。
会有一些space,可能是"on the stack",用于函数将return其结果转化为
一旦右侧的赋值执行完毕,该结构就不会存储在任何地方,因为它不存在。
- 它几乎肯定会为整个结构分配 space。
pa
的生命周期是 process_a
的主体,但是 *pa
的生命周期已经过期,如上所述。
因此,即使 inside process_a
. 也不能将 pa
的值用于任何事情(复制除外)
您的代码似乎 运行 没问题,因为 "appears to be running fine" 是一种有效的未定义行为形式,就像其他任何事情一样。
我有以下结构:
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() 函数之外可靠地使用该指针吗?
谢谢! 伊戈尔.
- 是的,可以将指针分配给结构的内部字段。
foo
在堆栈上- 就像你说的 - 这不太可能
pa
的生命周期就像任何局部变量一样 - 直到 func 结束。您不能在 func 范围之外使用它。但是,您在这里有一个不同的问题 - get_foo 的 return 值是临时的,一旦您超出了pa
的分配范围,它就会被释放,因此任何使用之后pa
指向的数据将导致未定义的行为。
- 是的,但它仅在结构的生命周期内有效。
- 从函数中 return 得到的结构是一个临时对象,它会立即被销毁。
会有一些space,可能是"on the stack",用于函数将return其结果转化为
一旦右侧的赋值执行完毕,该结构就不会存储在任何地方,因为它不存在。 - 它几乎肯定会为整个结构分配 space。
pa
的生命周期是process_a
的主体,但是*pa
的生命周期已经过期,如上所述。
因此,即使 insideprocess_a
. 也不能将
pa
的值用于任何事情(复制除外)
您的代码似乎 运行 没问题,因为 "appears to be running fine" 是一种有效的未定义行为形式,就像其他任何事情一样。