malloc 是动态内存分配吗?

m4r*_*c0s 5 c malloc dynamic-memory-allocation language-lawyer

我被教官说叫p = (int*)malloc(5 * sizeof(int))不是动态内存分配,并且p=(int*)malloc(n * sizeof(int))是动态内存分配。

讲师正在谈论基本数据结构并教授数组。他曾告诉我们使用int arr[100]语法创建数组的传统方法,但随后他向我们介绍了 malloc。

据他说,由于内存大小不会改变,我猜它不是动态的。

从我可以从互联网上收集的信息来看,malloc在运行时分配内存,以及在运行时分配内存时的动态内存分配。所以我认为这两个malloc语句都是动态内存分配。我的推理有问题吗?

klu*_*utt 7

通常,我们确实将调用malloc称为动态分配,无论您使用的是变量还是常量。即使是男人页malloc通话会这样:

malloc、free、calloc、realloc - 分配和释放动态内存

所以对于你的导师来说:

讲师正在谈论基本数据结构并教授数组。他曾告诉我们使用 int arr[100] 语法创建数组的传统方法,但随后他向我们介绍了 malloc。

据他说,由于内存大小不会改变,我猜它不是动态的。

好吧,从某种意义上说,如果您以更一般的方式严格地看待“动态”的含义,那么他是有道理的。现在我们有一个调用所有malloc动态分配的约定。这个约定可能是你老师声称的方式,没有任何问题。但事实并非如此。

此外,根据您老师的推理,使用 VLA:s(可变长度数组)或alloca使用变量将被视为动态分配,但事实并非如此。VLA 可以这样声明:int arr[n],或者alloca等价于:int *arr = alloca(n*sizeof(*arr))

因此,即使您可以争辩说您的老师有一个观点,也只会引起混乱,因为它违反了惯例。

此外,使用最动态的事情malloc是可以稍后调整分配的大小。你不能用数组来做到这一点,甚至 VLA:s 也不行。而且您不能对分配的内存执行此操作alloca

但作为旁注,如果他们教你写作,我确实质疑你的老师的能力

p = (int*)malloc(n * sizeof(int)) 
Run Code Online (Sandbox Code Playgroud)

代替

p = malloc(n * sizeof(*p))
Run Code Online (Sandbox Code Playgroud)
  1. 演员表不是必需的,只会增加混乱
  2. 使用sizeof(*p)而不是sizeof(int)更安全

相关:我是否转换了 malloc 的结果?

  • 也就是说,如果编译器看到带有编译时常量的“malloc()”调用,*并且能够证明它看到了结果的所有用途*,则允许优化“malloc()”调用。这当然是一个极端情况,但在类似情况下,编译器通常会替换其他标准函数(典型的例子是“memcpy()”)。 (2认同)

438*_*427 5

C 标准没有定义术语“动态内存分配”。所以我们不能拿 C 标准去查找什么是动态内存分配。

C 标准讨论了“内存管理函数”(即aligned_alloc、calloc、malloc、realloc 和free)。当使用这些函数时,它通常被称为动态内存分配,但是 - 重复一下 - 它不是标准中的术语。

该标准谈到“对象的生命周期”。使用上述内存管理功能之一创建的对象被称为具有“分配的存储持续时间”(这意味着它存在直到您的代码释放它)。

问题中的两行代码都p指向一个具有“分配的存储持续时间”的对象。

我的猜测是您误解了您的老师,即误解了“动态”的含义。可能你老师讲过分配对象的大小,即:

p = (int*)malloc(5 * sizeof(int));   // Here the size is static - always 5 ints

p = (int*)malloc(n * sizeof(int));   // Here the size is dynamic (aka depends on n)
Run Code Online (Sandbox Code Playgroud)

注意:(int*)C 中不需要演员表,即。