C中的全局变量和动态分配的变量之间的区别是什么?

时间:2016-09-23 21:27:39

标签: c memory-management malloc global-variables

假设您在编译时知道变量/指针的值,那么它之间有任何区别:

main(){

    int *x = (int *) malloc(sizeof(int));
    *x = 5;   
    ...
}

和此:

{{1}}

我知道后者将内存分配给堆,而前者分配堆栈,但是全局变量将在程序的持续时间内存储,存储在堆中的内容也将存储。那么这两段代码之间是否存在功能差异?

2 个答案:

答案 0 :(得分:3)

一个区别是变量的范围。可以从程序中的任何函数访问全局变量,而main()中的指针变量只能从该函数访问。要访问它在另一个函数中引用的内存,必须将其作为参数传递给函数(或者将变量的地址放入全局变量中)。

另一个不同之处在于您可以更改指针变量指向的地址。

int *x = malloc(sizeof(int));
*x = 5;   
int *y = x;
x = malloc(sizeof(int));
*x = 10;   // *y still contains 5

您无法更改全局变量的位置,只能更改其内容。

答案 1 :(得分:2)

注意:在下面的所有评论中,我假设代码是在普通的日常普通现代台式计算机上编译和运行的。

  

我知道后者为堆分配内存

True malloc从称为堆的内存区域获取内存。

  

前者是堆栈

错误,全局变量不存储在堆栈中。初始化的全局变量将其值存储在可执行文件中。该值从可执行文件加载到data segment

  

但是全局变量将在整个持续时间内存储   程序

<强>真

  

存储在堆中的东西

错误,从malloc获取的内存可以与free一起发布。因此,存储在堆中的项可能是临时的。它们不一定“在整个程序期间存储”

来自评论:

  

相似之处在于你有一个变量存储5可用   在全球范围内完成该计划。

错误,整个程序中第一个代码段中的全局变量可用。第二个片段中的指针是main的本地指针,仅当指针作为参数传递给这些函数时才可用于其他函数。例如,以下内容无效(因为foo无法访问x)。

void foo( void ) {
    printf( "%d\n", *x );
}

int main( void ) {
    int *x = malloc(sizeof(int));
    *x = 5; 
}