为啥 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 是保留空间还是只是将指针返回到起始位置? [复制]

有关C语言指针的问题:为啥最后结果是空指针?

声明一个返回特定类型函数指针的函数

为啥在将 malloc() 的指针分配给 char* 时会出现段错误?

void型指针

C程序定义一指针变量,直接令它赋值为NULL,不对它用malloc申请内存可以么?赋值和申请内存到底有啥区别