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?
- 我的爸爸活着的时间是多少?我可以可靠地在process_a()函数之外使用该指针吗?
谢谢!伊戈尔。
- 可以,但是只在结构的生命周期内有效。
- 函数返回的结构是一个临时对象,它会立即被销毁。
将有一些空间,可能是"在堆栈上",用于函数返回其结果。
一旦执行了赋值操作的右侧,该结构就不会存储在任何地方,因为它不存在。 - 它几乎肯定会为整个结构分配空间。
-
pa
的生命周期是process_a
的主体,而*pa
的生命周期已经过期,如上所述。
正因为如此,你不能使用pa
的值做任何事情(除了复制它),甚至process_a
里面的。
你的代码看起来运行得很好,因为"看起来运行得很好"是一种有效的未定义行为形式,就像任何东西和其他东西一样。
- 是的,将指针赋值给结构的内部字段是可以的。
-
foo
在栈上 - 就像你说的-不太可能
- 生命周期就像任何局部变量一样——直到函数结束。你不能在函数作用域之外使用它。然而,这里有一个不同的问题——get_foo的返回值是临时的,一旦超出了
pa
的赋值范围,它就会被释放,因此在此之后使用pa
所指向的数据将导致未定义的行为。
pa
的相关文章:
- 根据用户回答声明"Players"。用户选择玩家数量。播放器是结构体
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 包含 std::list 的结构体的 C++ 初始化
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 如何使用结构体的向量数组?
- 如何使用结构体在C++中更改这些代码?
- 无法在 Mosquitto MQTT Broker 插件上访问结构体 mosquitto 的元素
- 我应该如何在C++中使用结构体解决输入失败的问题?
- Qsort() 比较结构体整数的总和
- C++结构的一部分
- 如何使用迭代器指向结构体c++的向量
- 在C++中使用链表的堆栈实现中,访问结构体headNode成员count和top会导致运行时错误
- 如何获取结构体成员的地址
- 创建结构体向量,表达式:向量下标超出范围
- boost::任何带有结构体和无符号整数
- 如何在构造函数中初始化结构体的动态数组?
- 只写结构体的某些字段
- c++ WriteProcessMemory() -写结构体的一部分
- c++只赋值函数调用返回的结构体的一部分