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;
i
和 int
。它有一个可以写入值的内存位置。
但是,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 函数?