什么';C中全局变量和动态分配变量之间的区别是什么?
假设您在编译时知道变量/指针的值,这两者之间是否有任何区别:什么';C中全局变量和动态分配变量之间的区别是什么?,c,memory-management,malloc,global-variables,C,Memory Management,Malloc,Global Variables,假设您在编译时知道变量/指针的值,这两者之间是否有任何区别: int x = 5; main(){ ... } 这是: main(){ int *x = (int *) malloc(sizeof(int)); *x = 5; ... } 我知道后者将内存分配给堆,前者将内存分配给堆栈,但在整个程序期间都会存储一个全局变量,就像在堆中存储的东西一样。那么这两段代码在功能上有什么不同吗?注意:在下面的所有评论中,我假设代码是为普通的日常现代台式计算机编译并
int x = 5;
main(){
...
}
这是:
main(){
int *x = (int *) malloc(sizeof(int));
*x = 5;
...
}
我知道后者将内存分配给堆,前者将内存分配给堆栈,但在整个程序期间都会存储一个全局变量,就像在堆中存储的东西一样。那么这两段代码在功能上有什么不同吗?注意:在下面的所有评论中,我假设代码是为普通的日常现代台式计算机编译并运行的 我知道后者将内存分配给堆 True,
malloc
从称为堆的内存区域获取内存
前一个是堆栈
False,全局变量不存储在堆栈上。初始化的全局变量的值存储在可执行文件中。该值从可执行文件加载到
但全局变量将在整个过程中存储
节目
正确
存储在堆中的东西也是如此
False,从malloc
获得的内存可以通过释放。因此,存储在堆中的项可能是临时的。它们不一定“在整个程序期间存储”
从评论中:
相似之处在于,您将有一个存储5个可用变量的变量
在全球范围内完成该计划
False,第一个代码段中的全局变量可在整个程序中使用。第二个代码段中的指针是main
的本地指针,并且仅当指针作为参数传递给其他函数时才可用于这些函数。例如,以下操作不起作用(因为foo
无法访问x
)
一个区别是变量的范围。全局变量可以从程序中的任何函数访问,而main()
中的指针变量只能从该函数访问。要访问它在另一个函数中引用的内存,它必须作为参数传递给函数(或者变量的地址可以放入全局变量)
另一个区别是,您可以更改指针变量指向的地址
int *x = malloc(sizeof(int));
*x = 5;
int *y = x;
x = malloc(sizeof(int));
*x = 10; // *y still contains 5
您不能更改全局变量的位置,只能更改其内容。有区别吗?我没有看到任何相似之处(除了x
名称)。此外,第二个代码段完全是非法的。您可能想要一本C语言书。这不是一个辅导网站。您的具体问题是什么?您首先尝试找出了什么?1)C标准没有强制执行使用堆栈的实现,也没有强制执行动态内存分配(如堆)的特定实现。2) 一般情况下,不要使用malloc
&friends或void*
的结果。3) 不要使用不必要的强制转换或您不完全理解的强制转换。只有当变量是局部(自动)变量时,才是“堆栈上的前一个(在堆栈上)”,而该变量看起来不是局部(自动)变量,并且实现有一个堆栈时才是真的。在您的示例中,int*x=(int*)malloc(sizeof(int))
正如您所说,该要求在编译时已知,但是,a)动态地为单个int
分配内存是没有意义的,b)直到在程序运行时的某个点(如果有的话)需要时才分配内存。@EternalStudent在回答问题后更改该问题是非常糟糕的形式。更不用说更新后的第二个代码段不是有效的C,并且不会编译。我正在回滚编辑。
int *x = malloc(sizeof(int));
*x = 5;
int *y = x;
x = malloc(sizeof(int));
*x = 10; // *y still contains 5