2015-11-04 192 views
-2

我需要声明一个变量,是不是在栈内存,但在人堆里,像下面全局声明是堆栈还是堆?

struct mystruct *name; 

我应该声明它之外的所有功能(即使外面的main())在开始的文件?

+1

他们吗?变量在堆? hmmmm –

+1

C没有指定实现细节。 – Olaf

+0

@SouravGhosh:您可以使用基于堆的方法而不是堆栈。 – Olaf

回答

1

请注意,一个变量是从未申报“上堆”。只读存储器所指向的指针可以是上(从)堆中分配

在你的榜样,你可以声明name确实之外的任何功能,那么它会在全球内存中。您也可以delcare函数内部变量,由关键字static之前。后者将在全局内存中分配变量,但它只会在您声明它的函数中可见。

要使用指针变量,您现在必须为它指定内存以指向您使用malloc在堆上分配的内存。

0

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呼叫释放时间延长寿命(任何与malloccalloc,或者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); 
} 

变量ptrp只存在的各自的功能的寿命,并且它们会从堆栈中通常被分配。这两个变量对象从直到它与free释放它与malloc分配的时间存在。

大多数实现用于从堆allocated对象分配存储空间。

确实没有办法让你声明一个对象具有allocated存储期限;您可以通过malloccallocrealloc创建此对象的唯一方法。无论您声明用于存储由这些函数返回的指针值的对象将具有autostatic存储持续时间。


1.在实践中,对于所有的局部对象存储在函数入口被分配,并在函数出口释放,而不管对象的生命周期是否在整个功能或限于函数内的一个块。但是,您永远不应该依赖于在该对象的生命周期之外访问的存储。例如,ib的生存期限于for循环;即使每个存储的存储空间都可能已在函数入口处分配,您也不应尝试在循环体外访问该存储。毕竟,C被设计在一台带有堆栈的机器上。