【问题标题】:What's the difference between a global variable and a dynmically allocatedv variable in C?C中的全局变量和动态分配的变量有什么区别?
【发布时间】:2016-09-23 21:27:39
【问题描述】:

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

int x = 5;

main(){
  ...
}

还有这个:

main(){

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

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

【问题讨论】:

  • 有区别吗?我没有看到任何相似之处(x 名称除外)。而且,第二个 sn-p 根本是非法的..
  • 你可能想要一本 C 书。这不是辅导网站。您的具体问题是什么?您首先尝试找出自己的什么?
  • 1) C 标准没有强制实现使用堆栈,也没有强制实现像堆这样的动态内存分配。 2)一般不要投malloc&friends或void *的结果。 3)不要使用不必要的演员表或你不完全理解的演员表。
  • “前[在]堆栈上”只有当变量是本地(自动)变量时才为真,它似乎不是,并且如果实现有一个堆栈。在您的示例int *x = (int *) malloc(sizeof(int)); 中,正如您所说,要求在编译时是已知的,但是,a)为单个int 动态分配内存是没有意义的,并且 b)在某些时候需要它之前不会分配内存(如果有的话)在程序运行期间。
  • @EternalStudent 在回答问题后更改问题是非常糟糕的形式。更不用说更新的第二个 sn-p 不是有效的 C,并且不会编译。我正在回滚编辑。

标签: c memory-management malloc global-variables


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    和前者的堆栈

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

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

    正确

    堆中存储的东西也一样

    False,从malloc获得的内存可以用free释放。因此,堆中存储的项目可能是临时的。它们不一定“在整个程序的持续时间内存储”

    来自cmets:

    相似之处在于您将有一个变量存储 5 可用 全球范围内通过该计划。

    False,第一个sn-p中的全局变量在整个程序中都是可用的。第二个 sn-p 中的指针是 main 的本地指针,并且仅当指针作为参数传递给这些函数时才可用于其他函数。例如,以下将不起作用(因为foo 无权访问x)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-23
      • 1970-01-01
      • 2016-01-17
      • 2010-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多