gpt4 book ai didi

c - 内存段栈和堆

转载 作者:行者123 更新时间:2023-11-30 20:50:39 24 4
gpt4 key购买 nike

我已经查看了很多主题,但仍然无法找出为什么会发生这种情况:

struct B
{
int _arr[5];
};
struct A
{
struct B * _pb;
};
int main() {
int i;

struct B b;
struct A *pa = (struct A*)malloc(sizeof (struct A));
for (i=0;i<5;++i)
{
b._arr[i] = i;
}
pa->_pb=&b;
Struct A a = *pb;
}

为什么 pa 是在栈上找到的,而 *pa 是在堆上找到的!两者都是局部变量,并且只能在作用域内有效,因此它应该位于堆栈上。另外为什么 a._pb->_arr[2] 在堆栈上不应该在堆上?谁能帮我澄清一下它什么时候应该在堆栈上,什么时候在堆上

最佳答案

变量 pa 在堆栈上。它指向的内存位于堆上。

在某种程度上,指针变量可以这样描述:

+----+     +--------------------------------+| pa | --> | allocated memory for structure |+----+     +--------------------------------+

上面所示的两个位置(pa 及其指向的内存)可以位于不同的“段”中,也可以位于相同的“段”中。

并且 a._pb->_arr[2] 位于堆栈上,因为 a._pb 指向位于堆栈上的 b堆栈。

最后是关于“堆栈”的注释。虽然在堆栈上存储局部变量很常见,但 C 规范对此没有任何说明。局部变量确实是automatic variables ,而 C 规范只指定了它们的语义,而不是它们应该存储的位置。

关于c - 内存段栈和堆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41904399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com