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 );
}