gpt4 book ai didi

C Language : Why do dynamically-allocated objects return a pointer, 而静态分配的对象给你一个选择?

转载 作者:太空狗 更新时间:2023-10-29 14:54:21 25 4
gpt4 key购买 nike

这实际上是一个比我之前在这里问过的问题更简洁、更清楚的问题(对于任何关心的人):C Language: Why does malloc() return a pointer, and not the value? (对于那些最初认为我在发送垃圾邮件的人感到抱歉......我希望它不会被解释为同一个问题,因为我认为我在那里的措辞方式无意中误导了它)

-> 基本上我想问的是:为什么 C 程序员需要一个指向动态分配的变量/对象的指针? (无论变量/对象之间有什么区别...)

如果 C 程序员可以选择只创建“int x”或“int *x”(都是静态分配的),那么为什么他不能选择只初始化他的动态分配的变量/对象作为一个变量(而不是通过 malloc() 返回一个指针)?

*如果有一些晦涩的方法可以完成我上面解释的事情,那么,为什么 malloc() 似乎是大多数教科书中关于动态分配的方式?

最佳答案

注意:下面的byte指的是sizeof(char)

嗯,首先,malloc 返回一个 void *。它只是不能返回一个值:因为 C 缺少泛型,所以这是不可行的。在 C 中,编译器必须在编译时知道每个对象的大小;由于要分配的内存大小直到运行时才知道,因此必须返回一个可以表示任何值的类型。 void *可以表示任意指针,是最佳选择。

malloc 也无法初始化 block :它不知道正在分配什么。这与 C++ 的 operator new 形成对比,它既进行分配又进行初始化,并且类型安全(它仍然返回指针而不是引用,可能是出于历史原因)。

此外,malloc 分配一个特定大小的内存块,然后返回指向该内存的指针(这就是 malloc 代表的含义:内存分配)。你得到一个指针,因为这就是你得到的:一个未初始化的原始内存块。例如,当您执行 malloc(sizeof(int)) 时,您并不是在创建 int,而是在分配 sizeof(int) bytes 并获取这些字节的地址。然后您可以决定将该 block 用作 int,但从技术上讲,您也可以将其用作 sizeof(int) char 的数组.

各种替代方案(callocrealloc)的工作方式大致相同(calloc 在处理数组时更容易使用,而零- 填充数据,而 realloc 在需要调整内存块大小时很有用)。

关于C Language : Why do dynamically-allocated objects return a pointer, 而静态分配的对象给你一个选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7761998/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com