我是否正确地认为:
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.
一般来说,分配你经常使用的任何东西并且在堆中大于一百个字节,以及堆栈中的小变量和指针是一个很好的经验法则.
看到你写的
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)将被调用函数分配的内存传递给调用函数.
你buff
的不相同.
第一个(char *buff[500]
)是一个包含500个指针的数组; 第二个(char *buff = (char *)malloc(500)
)是一个指针.
指针(在堆栈上)指向堆上 500字节的内存(如果malloc调用成功).
指针数组在堆栈上.它的指针未初始化.
归档时间: |
|
查看次数: |
31191 次 |
最近记录: |