首页 文章

c仅分配函数调用返回的struct的一部分

提问于
浏览
1

我有以下结构:

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
    • 是的,但它仅在结构的生命周期内有效 .

    • 从函数返回的结构是一个临时对象,它会立即被销毁 .
      将有一些空间,可能是"on the stack",用于将结果返回到的函数 .
      一旦执行了赋值的右侧,结构就不会存储在任何地方,因为它不存在 .

    • 几乎可以肯定为整个结构分配空间 .

    • pa 的生命周期是 process_a 的主体,但 *pa 的生命周期已过期,如上所述 .
      因此,即使在 process_a 内,也不能将 pa 的值用于任何内容(复制除外) .

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

  • 0
    • 是的,可以指定一个结构内部字段的指针 .

    • 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 后指出会导致不确定的行为数据的使用 .

相关问题