什么';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