【问题标题】:How much memory does int x[10] allocate?int x[10] 分配了多少内存?
【发布时间】:2017-05-18 23:41:06
【问题描述】:

这两个代码行的内存使用有什么区别吗?

int *a = malloc( 10 * sizeof(int) );
int b[10];

第一行应该为 10 个整数和 1 个指针分配内存。但我不确定第二个。这还会为 10 个整数和 1 个指针分配内存,还是只为 10 个整数分配内存?

【问题讨论】:

    标签: c malloc


    【解决方案1】:

    简单地说:

    int *a = malloc( 10 * sizeof(int) );
    

    为指针*a 分配至少sizeof(int*) 字节的自动存储空间。当调用malloc 时,这将为您的程序分配至少sizeof(int) * 10 字节的动态存储空间。

    另一方面:

    int b[10];
    

    至少分配 sizeof(int) * 10 字节的自动存储。这里没有指针。当您在表达式中使用名称 b(例如:a = b)时,它会衰减为指针。但是a 是一个指针,b 是一个数组。在 C 常见问题解答中查看此内容:C-FAQ Sec. 6: arrays and pointers

    在最常见的情况下,“自动存储”是指“栈”,“动态存储”是指“堆”。但这并不总是正确的。您可能想在这个问题中阅读一些关于此术语的讨论:"Why are the terms “automatic” and “dynamic” preferred over the terms “stack” and “heap” in C++ memory management?"

    【讨论】:

    • 它可能会或可能不会在堆栈中为指针 *a 分配任何内存,具体取决于编译器的工作方式。如果你在任何地方使用&a,是的,否则所有的赌注都会被取消。
    • 谢谢。我会修改我的答案。
    • @DietrichEpp 再次阅读,我可能误解了您的评论。你能举个具体的例子吗?
    • @giusti:一方面可以优化变量。
    • 但这对于任何变量都是正确的。如果不获取指针的地址,指针有什么特别之处会导致分配有所不同吗?
    【解决方案2】:

    在第一种情况下,a 本身占用了sizeof(int *) 字节的自动存储空间,它指向了10 * sizeof(int) 字节的动态存储空间。

    在后一种情况下,b 占用10 * sizeof(int) 字节的自动存储空间。因为b是一个数组,所以没有指针。

    所以第一种情况使用了更多的总字节数,但在堆栈上更少(假设堆栈正在用于自动存储)。

    如果使用的总字节数相对较少,自动存储通常没问题。对于较大的数量,动态存储是首选。特别是对于堆栈实现,自动变量过多且太大会溢出堆栈。

    【讨论】:

      猜你喜欢
      • 2012-08-28
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 2014-05-20
      相关资源
      最近更新 更多