回答
请注意,一个变量是从未申报“上堆”。只读存储器所指向的指针可以是上(从)堆中分配。
在你的榜样,你可以声明name
确实之外的任何功能,那么它会在全球内存中。您也可以delcare函数内部变量,由关键字static
之前。后者将在全局内存中分配变量,但它只会在您声明它的函数中可见。
要使用指针变量,您现在必须为它指定内存以指向您使用malloc
在堆上分配的内存。
TL; DR版
你不能声明一个变量,使得变量本身住在堆。
詹姆斯·米切纳版本
C语言定义不谈论堆栈或堆;它谈论存储持续时间。
对象与auto
存储持续时间(块中的static
关键字中,没有声明任何东西)具有从该块和结束的开始延伸寿命当块退出:
void foo(void)
{
int a = 0; // lifetime of a extends to the end of
// the function
for (int i = 0; i < 10; i++) // lifetime of i and b extend to the end
{ // of the for loop
int b = a + i;
printf("b = %d\n", b);
}
}
大多数实现分配存储用于从硬件堆栈auto
对象,因为堆叠使得该行为易于实现。
对象与static
存储持续时间(任何一个功能的static
关键字外或声明)具有从程序被加载到存储器中的时间延长的寿命,直至程序退出:
int a = 0; // lifetime of a extends over the lifetime of
// the entire program
int main(void)
{
static int b = 10; // lifetime of b also extends over the lifetime
// of the program, but is only visible within
// main
...
}
大多数实现为可执行文件本体内的static
对象留出存储空间(对于使用ELF格式的可执行文件,此类对象将存储在图像的.bss
,.data
或.rodata
部分)。
对象与allocated
存储持续时间有从他们被分配,直到它们被明确地给free
呼叫释放时间延长寿命(任何与malloc
,calloc
,或者realloc
分配)。
int *foo(size_t size)
{
int *ptr = malloc(sizeof *ptr * size);
return ptr;
}
void bar(void)
{
int *p = foo(10);
// do something with p
free(p);
}
的变量ptr
和p
只存在的各自的功能的寿命,并且它们会从堆栈中通常被分配。这两个变量点对象从直到它与free
释放它与malloc
分配的时间存在。
大多数实现用于从堆allocated
对象分配存储空间。
确实没有办法让你声明一个对象具有allocated
存储期限;您可以通过malloc
,calloc
或realloc
创建此对象的唯一方法。无论您声明用于存储由这些函数返回的指针值的对象将具有auto
或static
存储持续时间。
1.在实践中,对于所有的局部对象存储在函数入口被分配,并在函数出口释放,而不管对象的生命周期是否在整个功能或限于函数内的一个块。但是,您永远不应该依赖于在该对象的生命周期之外访问的存储。例如,
i
和b
的生存期限于for
循环;即使每个存储的存储空间都可能已在函数入口处分配,您也不应尝试在循环体外访问该存储。毕竟,C被设计在一台带有堆栈的机器上。 - 1. cin是堆栈还是堆栈?
- 2. C++是堆栈还是堆分配?
- 3. 了解Haskell的`map` - 堆栈还是堆?
- 4. 全堆栈,堆栈交换等,什么是堆栈?
- 5. 有关堆栈段声明
- 6. 在全局/函数范围中声明变量。堆栈差异?
- 7. 类的字段,它们是存储在堆栈还是堆?
- 8. 如何判断指针是指向堆栈还是指向堆?
- 9. 堆上,而不是堆栈
- 10. 是堆栈或堆make_pair?
- 11. NSObject:在堆上还是在栈上?
- 12. C++ STL内存管理:堆栈还是堆?
- 13. C数组实例化 - 堆栈还是堆分配?
- 14. 创建线程对象在哪里?堆栈还是堆?
- 15. 成员函数内存分配堆栈还是堆?
- 16. 休眠 - 在堆栈上还是在堆上?
- 17. 我应该让堆栈段很大还是堆段很大?
- 18. 编译与堆栈声明错误
- 19. 堆栈变量或函数声明
- 20. 堆栈上声明的最大允许大小是多少?
- 21. 是否可以在声明中修复堆栈大小?
- 22. ptrace会中断CPU上下文,用户空间堆栈还是内核堆栈?
- 23. 错误:超出全局堆栈
- 24. 更改全局堆栈大小,GNU Prolog
- 25. 如何创建全局导航堆栈?
- 26. 服务堆栈启用全局压缩
- 27. 错误:全局堆栈与追加/ 3
- 28. 堆栈是实现细节,还是不是?
- 29. 当声明一个大型数组时,堆栈/堆溢出
- 30. 在函数中创建的对象,是保存在堆栈还是堆上?
他们吗?变量在堆? hmmmm –
C没有指定实现细节。 – Olaf
@SouravGhosh:您可以使用基于堆的方法而不是堆栈。 – Olaf