c++只赋值函数调用返回的结构体的一部分

c++ assigning only part of struct returned by function call

本文关键字:结构体 一部分 返回 函数调用 赋值 c++      更新时间:2023-10-16

我有以下结构体:

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的值做任何事情(除了复制它),甚至 process_a里面的

你的代码看起来运行得很好,因为"看起来运行得很好"是一种有效的未定义行为形式,就像任何东西和其他东西一样。

  • 是的,将指针赋值给结构的内部字段是可以的。
  • foo在栈上
  • 就像你说的-不太可能
  • pa
  • 生命周期就像任何局部变量一样——直到函数结束。你不能在函数作用域之外使用它。然而,这里有一个不同的问题——get_foo的返回值是临时的,一旦超出了pa的赋值范围,它就会被释放,因此在此之后使用pa所指向的数据将导致未定义的行为。