c ++只分配函数调用

时间:2015-05-29 12:40:09

标签: c++ struct stack heap assign

我有以下结构:

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 个答案:

答案 0 :(得分:0)

  • 是的,可以指定一个指向结构内部字段的指针。
  • foo正在堆叠
  • 就像你说的那样 - 它不太可能
  • pa的生命周期就像任何局部变量一样 - 直到func结束。你不能在功能范围之外使用它。但是,这里有一个不同的问题 - get_foo的返回值是临时的,一旦超出pa的赋值范围,它就会被释放,因此{{1}指向的数据的任何使用都会被释放之后会导致未定义的行为。

答案 1 :(得分:0)

  • 是的,但它仅在结构的生命周期内有效。
  • 从函数返回的结构是一个临时对象,它会立即被销毁 将有一些空间,可能是“在堆栈上”,函数将其结果返回。
    一旦执行了赋值的右侧,结构就不会存储在任何地方,因为它不存在。
  • 几乎可以肯定为整个结构分配空间。
  • pa的生命周期是process_a的正文,但*pa的生命周期已过期,如上所述。
    因此,您不能将pa的值用于任何内容(除了复制它),甚至 in process_a

您的代码似乎运行正常,因为“似乎运行正常”是一种有效的未定义行为形式,就像任何事情一样。