C 中的全局变量和动态分配的 v 变量有什么区别?



假设您知道变量/指针在编译时的值,这之间有什么区别吗?

int x = 5;
main(){
  ...
}

:

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

我知道后者将内存分配给堆,前者将内存分配给堆栈,但是全局变量将在整个程序运行期间存储,就像存储在堆中的东西一样。那么这两段代码在功能上有什么不同吗?

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

另一个区别是你可以改变指针变量指向的地址。

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

你不能改变全局变量的位置,只能改变它的内容

注意:在下面的所有注释中,我假设代码是为普通的现代台式计算机编译并运行的。

我知道后者将内存分配给堆

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

和前者的堆栈

False,全局变量不存储在堆栈中。初始化的全局变量的值存储在可执行文件中。该值是从可执行文件加载到数据段的。

,但全局变量将在整个过程中被存储项目

真正

和存储在堆中的

Falsemalloc获得的内存可以随free释放。因此,存储在堆中的项可能是临时的。它们不一定"在整个程序期间存储"

从注释中:

相似之处在于,您将有一个可用的变量存储5

False,第一个代码片段中的全局变量在整个程序中可用。第二个代码片段中的指针是main的局部指针,只有当指针作为参数传递给其他函数时,它才可用于这些函数。例如,下面的代码不能工作(因为foo没有访问x的权限)。

void foo( void ) {
    printf( "%dn", *x );
}
int main( void ) {
    int *x = malloc(sizeof(int));
    *x = 5; 
}  

相关内容

  • 没有找到相关文章

最新更新