显然动态内存分配允许在运行时分配内存,而不是像静态内存分配那样在编译时分配内存。我还了解到,在 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++;
}
...我的困惑在于以下代码是否属于动态内存分配。
具有可变长度数组 (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)。