关于C中动态内存分配的问题

时间:2013-11-22 17:38:09

标签: c dynamic-memory-allocation

  1. 之间有什么区别
    int size;
    int *arr;
    scanf("%i", &size);
    arr = malloc(size * sizeof(*arr));
    

    int size;
    scanf("%i", &size);
    int arr[size];
    
  2. 当我想为2个大数字分配内存时,我会使用 以下代码:

        unsigned long *big_nums;
        big_nums = malloc(2 * sizeof(*big_nums));
    

    我会使用big_nums [0]访问第一个大号bumber     一个有big_nums [1]。假设 unsigned long 大4字节,     然后代码将分配2 * 4 = 8个字节。让我们说我做     像这样的东西:

        unsigned long *big_nums;
        big_nums = malloc(7);
    
  3. 使用big_nums [0]对我来说很清楚,但big_nums [1]怎么样?将         它会导致某种分段错误错误或什么?

3 个答案:

答案 0 :(得分:2)

有两个地方可以获取内存:堆栈和堆。堆栈是您分配短期事物的地方,堆用于分配长期事物。

malloc()从堆中分配,int arr[size]从堆栈中分配。

当您的功能退出时,arr[size]将自动处理,但malloc()则不会。这导致了所谓的“内存泄漏”。

big_nums = malloc(7);
如果访问big_nums [1],

确实会出错。一般来说,标准说行为是“未定义的”,这意味着它可以工作,也可能不工作。

答案 1 :(得分:1)

对于Q#1:第二个版本将(尝试)在堆栈上分配可变长度数组。在C99以后,这是可能的;但是在传统的C中,可变长度数组不存在,您必须使用malloc自己滚动它们。

答案 2 :(得分:0)

对于Q#2:您将被允许犯这个错误。当你写入数组的第二个元素时,你将覆盖一个不属于你的字节。

我的猜测是,在大多数情况下,没有任何不好的事情会发生,因为malloc(7)将秘密地等同于malloc(8)。但是这有 NO GUARANTEE 。任何事情都可能发生,包括段错或更糟糕的事情。

顺便说一下,如果你有两个不同的问题,最好将它们写成两个单独的问题。你得到更多分数。