堆栈变量与堆变量

Jac*_*vin 39 c

我是否正确地认为:

char *buff[500];
Run Code Online (Sandbox Code Playgroud)

...创建一个堆栈变量,并:

char *buff = (char *)malloc(500);
Run Code Online (Sandbox Code Playgroud)

...创建堆变量?

如果这是正确的,何时以及为什么要使用堆变量而不是堆变量,反之亦然.我知道堆栈速度更快还有别的.

最后一个问题,堆栈框架的主要功能是什么?

Ark*_*nez 56

是的,第一个在堆栈中创建一个char指针数组,500*4 bytes第二个在堆中分配500个字符,并将堆栈char ptr指向它们.

在堆栈中分配既简单又快速,但堆栈有限,堆慢但更大.除此之外,一旦离开范围,堆栈分配的值将被"删除",因此对于像原始变量这样的小本地值非常有用.

如果你在堆栈中分配太多,你可能会耗尽堆栈并死掉,main因为你执行的所有函数在堆栈中都有一个堆栈帧,并且函数的所有局部变量都存储在那里,所以进入函数调用可能太深了让你进入stackoverflow.

一般来说,分配你经常使用的任何东西并且在堆中大于一百个字节,以及堆栈中的小变量和指针是一个很好的经验法则.

  • 标记为答案? (4认同)
  • 另外2指出在堆上使用内存时应该格外谨慎.由于指针存储在堆栈中(因此是本地的),这会导致内存管理问题,例如悬空指针.所以更喜欢使用智能指针. (3认同)

Ber*_*ann 9

看到你写的

char *buff = (char *)malloc(500);
Run Code Online (Sandbox Code Playgroud)

你可能意味着

char buff[500];    instead of 
char* buff[500];
Run Code Online (Sandbox Code Playgroud)

在你的第一个例子中(所以你有一个char数组,而不是一个指向字符的指针数组)

是的,堆栈上的"分配"更快,因为您只需增加存储在ESP寄存器中的指针.

如果需要,需要堆变量:

1)比堆栈中更多的内存(通常更早)

2)将被调用函数分配的内存传递给调用函数.


pmg*_*pmg 9

buff的不相同.

第一个(char *buff[500])是一个包含500个指针的数组; 第二个(char *buff = (char *)malloc(500))是一个指针.

指针(在堆栈上)指向堆上 500字节的内存(如果malloc调用成功).
指针数组在堆栈上.它的指针未初始化.