我不明白到底什么是动态内存分配

问题描述 投票:0回答:1

显然动态内存分配允许在运行时分配内存,而不是像静态内存分配那样在编译时分配内存。我还了解到,在 malloc.h 中使用这些函数,我们可以通过使用 free() 取消分配未使用的内存块来节省内存。但我的困惑在于以下代码是否属于动态内存分配。

#include <stdio.h>

int main() {
    int n;
    scanf("%d",&n);
    int a[n];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    for(int i=0;i<n;i++){
        printf("%d",a[i]);
    }

    return 0;
}

当上面的代码用于运行时分配的目的时,当我希望用户指定大小时,malloc.h 函数有什么好处? malloc、calloc 和 realloc 有何不同? 另外,如果使用 malloc 如下:

ptr=(int*)malloc(3*sizeof(int));

这与

有何不同?

int ptr[5];

如果在编写代码时不知道需要的内存,是否可以不声明指针,然后简单地执行 ++ 将值存储到下一个内存地址,如下所示?

int* ptr;
while(1){
   scanf("%d",ptr);
   ptr++;
}
c stack malloc dynamic-memory-allocation heap
1个回答
0
投票

...我的困惑在于以下代码是否属于动态内存分配。

具有可变长度数组 (VLA) 的代码正在使用动态内存。 它可能来自与

malloc()
不同的内存池。

malloc.h 函数有什么好处...(?)

malloc()
的返回值可以检查成功/失败。 (VLA) 没有标准检查。

malloc、calloc 和 realloc 有何不同?

malloc()
分配尚未初始化的内存。
calloc()
使用位模式 0 分配已初始化的内存。
ralloc()
重新分配内存。 如果大小增加,内存不一定未初始化。


ptr=(int*)malloc(3*sizeof(int));
int ptr[5];
的不同之处在于,
malloc()
失败是可以检测到的。 第一个没有声明对象
ptr
,第二个则声明了。 当然,它们的尺寸不同,如 3 != 5。


如果在编写代码时不知道需要的内存,是否可以不声明指针,然后简单地执行 ++ 将值存储到下一个内存地址,如下所示?

不。

scanf("%d",ptr);
的第一次迭代在
ptr
中传递未初始化的值,导致 未定义的行为 (UB)。

© www.soinside.com 2019 - 2024. All rights reserved.