C - 声明变量并调用 malloc

Posted

技术标签:

【中文标题】C - 声明变量并调用 malloc【英文标题】:C - Declaring variables and calling malloc 【发布时间】:2014-10-02 01:48:18 【问题描述】:

我不明白为什么你必须同时做这两个。 malloc 不是为您创建动态内存吗?那么为什么我们必须在开始时声明例如“int”,而稍后我将分配该变量。我是 malloc 的新手,如果这个问题有一个明显的答案,我很抱歉。

例子:

主要是:

int *p;

然后在函数后面:

int *p = malloc(1000 * sizeof(int));

【问题讨论】:

Malloc 与指针一起使用,因为它们指向(顾名思义)内存中的某个对象。要在指针中存储一些新值,您必须为其分配(保留)内存。 malloc 常用于未知大小的数组 但是为什么我在内存中有两个地方存放这个 int 呢?曾经在 int 中,我在 malloc 之前和之后都清除了 你不能 malloc 一个变量,因为一个变量有一个名字。始终清楚地区分对象、指向对象的指针和对象的(可选)名称。 问题中的代码无法编译。您有两个 p 声明,这是一个太多了。只透露一小段代码,你就让自己的生活变得不必要地艰难。如果你能设法展示一个完整的功能,那么我们的生活会更轻松。 【参考方案1】:

malloc 不是为你创建动态内存吗?

确实如此。但是,您也需要能够在某处保存该内存的地址。

int *ptr = malloc(1000 * sizeof(int));
...
free(ptr); // Once you are done, you need to release the memory by calling free

地址存储在一个指针ptr中,需要少量的内存来存储。您使用该指针来引用您已分配的内存。

【讨论】:

需要注意的是,free应该在ptr上调用,以防止内存泄漏。 所以,基本上开头声明的 int 保存了指针所需的小内存。 它保存指针存储在某处所需的内存。 @user3753834 ptr 不是int,而是int*。星号表示一个指针,而int 提供了该指针所指向的元素的类型。指针占用少量内存。该大小与它们指向的内存块的大小无关。一个恰当的类比是在书中定位一段:无论这本书有多大,写下页面、行和字符编号所需的一点空间就足以记录任何段落的位置。指针也可以被认为是一个非常短的“通道”,因此它需要一些空间来存储。 我对上面的问题进行了编辑,以使其更清楚。那也是我所指的两个整数。我在问什么,为什么我需要两个可以在 main 和另一个函数中看到的指针整数。【参考方案2】:

以下两个定义有很大区别:

int i;
int *pI;

iint。它有一个可以写入值的内存位置。

但是,pI 不是int。它是一个指向int 的指针。它的值是一个地址。在将值指向一个大到足以容纳int 的有效内存位置之前,您无法将值写入它所指向的内存位置。例如:

pI = &i;
*pI = 10;

您可以使用关键字void 创建通用指针,但不能取消引用void 指针。编译器需要知道日期类型才能取消引用指针。

int i;
void *pV;

pV = &i;
*(int *)pV = 10;

【讨论】:

【参考方案3】:

如果您在 main 中声明 int *p 并在函数中再次声明,那么您将获得两个具有不同范围的指针,函数中的 p 仅在输入函数时才在范围内,并且在函数返回时变得无关紧要,除非您的函数返回函数 p 到 main 的地址。

【讨论】:

如果返回函数p的地址,必须是static,否则解引用无效。 True 指针在栈上,函数中的 malloc 在堆上,但是函数返回时指针无效,这就是为什么我不在函数中声明指针,将它们传递给函数相反,使用数组更安全。【参考方案4】:

在 int 的特定情况下,您可能不想动态创建内存空间。当您不知道内存使用的最坏情况时,您只会想要这样做。

如果您要创建一个 int 指针,情况就完全不同了。更多信息请关注this post

【讨论】:

可以在没有malloc 的情况下声明结构或数组。此外,将malloc 用于原始类型同样有效。

以上是关于C - 声明变量并调用 malloc的主要内容,如果未能解决你的问题,请参考以下文章

调用 malloc 函数并不总是在内部调用 sbrk 函数?

malloc 和全局变量声明在 C 中将它们的变量分配到哪里? [复制]

dlmalloc源码剖析之:mALLOc

dlmalloc源码剖析之:mALLOc

dlmalloc源码剖析之:mALLOc

dlmalloc源码剖析之:mALLOc