为啥 malloc 返回一个指针?指针有啥用?
Posted
技术标签:
【中文标题】为啥 malloc 返回一个指针?指针有啥用?【英文标题】:Why malloc returns a pointer? What is the usefulness of pointers?为什么 malloc 返回一个指针?指针有什么用? 【发布时间】:2022-01-02 16:22:49 【问题描述】:我很难理解指针的用处。我已经阅读了类似问题的答案,但它们似乎并没有让我明白。
假设我们想要动态分配一些空间来使用变量,我们会做这样的事情:int *i = malloc(sizeof(int))
。我不明白为什么 C 的创建者觉得需要一个指针来完成这项工作。为什么他们没有 malloc 返回 (void) 类型的内存(如果这通常不可能,请纠正我)而不是 (void*) 指针指向该内存。其语法类似于int i = malloc(sizeof(int))
。
我知道这个问题可能很抽象,因为我没有解释我的大脑所需要的所有知识。如果我说的东西没有意义,请随时告诉我,以便我详细说明。提前谢谢!
【问题讨论】:
您不需要为示例中的单个变量使用malloc
,定义 int i;
就可以了,然后语法 int i = 42;
将分配一个初始化的 value 到i
.
@WeatherVane 我知道在特定情况下我有这个选项,但这并不能解释为什么在动态分配内存时需要在 C 中使用指针。
对于可变长度数组(如果支持),它们不是必需的。您可以定义int len = 42; int i[len];
来动态定义一个数组(并且您不必清理),但它的范围会受到限制。
@WeatherVane 你能告诉我在哪里可以阅读哪些是必要的案例吗?
指针的一个用处是,您可以通过指针传递信息,而不是信息本身。就像你写在纸上的家庭住址不是房子本身,而是它的位置。如果有大量数据,将其传递给您,则不需要复制该数据所需的资源开销:您只需要传递有关数据位置的信息(指针)。它还解决了当数据被修改时,它只存在于一个地方,您不必跟踪(和更新)所做的副本的问题。
【参考方案1】:
malloc
不知道内存分配给什么。
以向量的内存分配为例。
类似的东西
ptr = malloc(70 * sizeof(int));
你可以在那里写一些整数,然后读取相同的向量作为一个字符串。
指针的一个重要用途是通过间接进行高效编程。运行
#include <stdio.h>
int main()
int ref = 99;
int *a=&ref;
int *b=a;
printf("a:%d b:%d ref:%d\n", *a,*b,ref);
*a = 100;
printf("a:%d b:%d ref:%d\n", *a,*b,ref);
return 0;
看看会发生什么。 在大型向量处理应用程序中,一次更改更多值会带来性能提升。
【讨论】:
我们可以选择像字符一样读取int
变量,即使我们动态分配它。假设我们初始化int a = malloc(sizeof(int))
,在这种情况下,分配不会以我们可以读取a
的方式限制我们。
在这种情况下分配的内存没有被使用。
你不应该转换malloc
的结果:***.com/questions/605845
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。
我想证明它可以用作整数。我编辑了答案以使其清楚。【参考方案2】:
C 没有其他方法可以区分值类型(存储在内存单元中)和引用类型(存储对值的引用)。 一旦你考虑结构或数组,它就会变得更加明显,即你不能存储到单个内存单元中的所有内容。
int *p = malloc(n*sizeof(int));
上面的表达式不可能翻译成您建议的语法的合理等价物;
int p = malloc(n*sizeof(int));
如果你废除指针语法,你只有一个选择:
p
包含已分配空间的内存地址(巧合的是,它们也是整数值)。这意味着每个指针(或引用类型)变量的类型都是 int
询问您进行转换(并且仍然需要引用运算符)。
【讨论】:
在数组的情况下,其名称本身就是一个指针,我理解为什么我们希望 malloc 返回一个指针。但是对于结构体,我们仍然可以说struct student ; struct student p = malloc(sizeof(struct student));
。在这种情况下我找不到问题。
@BillTheKid 说数组名称是指针是不正确的:它不是。但在某些情况下使用名称 decays 指向数组第一个元素的指针。
int i
是值类型,int* i
是指针。 student p
暗示它是一种不需要释放内存的值类型。您正在产生不一致,而除了稍微简化的语法之外什么也没得到。
@Beltway 好的,我明白了。现在说得通了!
Inconsistency 可能措辞不佳:许多高级语言默认将所有结构/对象视为引用类型,并使用您建议的语法,但与 C 不同的是,这些不需要您自己管理内存.以上是关于为啥 malloc 返回一个指针?指针有啥用?的主要内容,如果未能解决你的问题,请参考以下文章
malloc 是保留空间还是只是将指针返回到起始位置? [复制]