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语句都是动态内存分配。我的推理有问题吗?
通常,我们确实将调用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)
sizeof(*p)而不是sizeof(int)更安全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 中不需要演员表,即。