C 全局声明在堆栈或堆中?
我需要声明一个不在堆栈内存中而是在堆中的变量,如下所示C 全局声明在堆栈或堆中?,c,C,我需要声明一个不在堆栈内存中而是在堆中的变量,如下所示 struct mystruct *name; 我是否应该在文件开头的所有函数之外(甚至main()之外)声明它?请注意,变量从未声明为“在堆上”。只能在堆上(从堆中)分配指针指向的内存 在您的示例中,您可以在任何函数之外声明name,然后它将存在于全局内存中。您还可以删除函数中的变量,前面加上关键字static。后者也将在全局内存中分配变量,但它只在声明它的函数中可见 要使用指针变量,您现在必须分配它所指向的内存,您可以使用mallocT
struct mystruct *name;
我是否应该在文件开头的所有函数之外(甚至main()之外)声明它?请注意,变量从未声明为“在堆上”。只能在堆上(从堆中)分配指针指向的内存 在您的示例中,您可以在任何函数之外声明
name
,然后它将存在于全局内存中。您还可以删除函数中的变量,前面加上关键字static
。后者也将在全局内存中分配变量,但它只在声明它的函数中可见
要使用指针变量,您现在必须分配它所指向的内存,您可以使用
malloc
TL;DR版本
不能声明一个变量,使该变量本身存在于堆上
詹姆斯·米切纳版本
C语言的定义不涉及堆栈或堆;它讨论了存储持续时间
具有auto
存储持续时间的对象(在块内声明的任何内容,并且没有static
关键字)的生存期从该块的开始到块退出时结束1:
大多数实现将在可执行文件本身的主体内为静态对象留出存储空间(对于使用该格式的可执行文件,此类对象将存储在图像的.bss
、.data
或.rodata
部分)
已分配存储持续时间的对象(使用malloc
、calloc
或realloc
分配的任何对象)的生存期从分配到调用free
为止
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
仅在各自函数的生命周期内存在,通常从堆栈中分配。这两个变量所指向的对象从分配给malloc
到释放free
都存在
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 );
}
大多数实现从堆中为已分配的对象分配存储
您实在无法声明已分配了存储持续时间的对象;创建此类对象的唯一方法是通过malloc
、calloc
或realloc
。声明用于存储这些函数返回的指针值的任何对象都将具有auto
或static
存储持续时间
1.实际上,所有本地对象的存储在函数进入时分配,在函数退出时释放,而不管对象的生存期是在整个函数中还是仅限于函数中的一个块。但是,您永远不应该依赖于在该对象的生命周期之外可以访问该存储。例如,i
和b
的生命周期被限制在For
循环中;即使每个函数的存储可能已在函数输入时分配,也不应尝试在循环体之外访问该存储。
2.毕竟,C是在带有堆栈的机器上设计的。
em?堆上的变量?hmmmmC未指定实现细节。@SouravGhosh:您可以使用基于堆的方法而不是堆栈。static
可能有助于防止在堆栈上分配局部变量。请阅读。然后问一个新问题,关于你想完成什么,而不是你想弄明白什么。
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 );
}