当前位置: 首页 > 知识库问答 >
问题:

C数组实例化-堆栈还是堆分配?

安泰平
2023-03-14

我保证这个问题以前被问过,但是我没有能够通过搜索找到它;对于任何冗余,请提前道歉。

我的理解(可能是错误的)是,只有在编译时知道对象的大小时,才能分配给堆栈。因此,在初始化数组的情况下,可以执行以下操作之一(这应该放在堆栈上):

char charArray[50];

由于这个数组的大小在编译时是已知的,所以这应该没有问题。

另一方面,这(我相信)也是有效的代码:

char anotherCharArray[someVariable + 50];

这也会被放在堆栈上吗?我很确定如果你释放()这个,代码会出错,所以我认为它会出错,但对我来说没有意义。类似地,当数据通过malloc分配时,是否只有在100%的情况下才必须使用free()?

提前感谢您的帮助。

共有2个答案

松正阳
2023-03-14

同样,当通过malloc分配数据时,是否只有100%的情况必须使用free()?

对(除了calloc和realloc之外,它们的返回值也是free()'d。类似地,也有使用malloc()的函数,并且这一事实是有文档记录的,例如strdup()-显然,这些函数的返回值也是使用free()来释放的。)

char anotherCharArray[someVariable + 50];

这也会在堆栈上吗?

是的,确实如此(在大多数实现中——当然,您的假设并不总是正确的,但在大多数平台上,确实如此)。是的,这是有效的代码,但它是C99中唯一的标准代码。

薛扬
2023-03-14

如果<代码>字符字符[50] 是在文件范围(所有函数之外)定义的,或者是静态的,它不在堆栈上,而是在程序的开始变量处预先分配的全局变量。如果它不是静态的,并且是在函数范围内定义的,那么它将在堆栈上。

另一个字符[某个变量50] 只能在函数范围内定义,并且将位于堆栈上。

以上所有内容都适用于C语言的典型实现。非典型的实现可能使用堆而不是堆栈,也可能使用堆而不是程序数据部分中预先分配的空间。

您不需要使用malloc()、calloc()或realloc()分配未分配的内容。易于理解的某些函数可能暗示使用上述函数之一,例如POSIXstrdup()

 类似资料:
  • 问题内容: 我有一个这样的数组声明: 这是原始类型的数组。该数组存储在哪里?它存储在堆还是堆栈上?这是一个原始类型,所有原始类型都不存储在堆上。 问题答案: 正如gurukulki所说,它存储在堆中。但是,你的帖子提出了一个误解,可能是由于一些善意的人传播了“原始生物始终存在”的神话。这是不正确的。局部变量在堆栈上有其值,但并非所有原始变量都是局部的… 例如,考虑一下: 现在,住在哪里?神话暗示它

  • 主要内容:Stack 类中的属性,Stack 类中的方法在 C# 中,堆栈(Stack)类表示一个后进先出的对象集合,当您需要对项目进行后进先出的访问时,则可以使用堆栈。向堆栈中添加元素称为推入元素,从堆栈中移除元素称为弹出元素。 Stack 类中的属性 下表列出了 Stack 类中一些常用的属性: 属性 描述 Count 获取堆栈中包含的元素个数 IsSynchronized 判断是否同步对堆栈的访问(线程安全) SyncRoot 获取可用于同步对堆

  • JVM规范(JSE 8版)提到: 第12页:2.5.2 JVM堆栈:“因为JVM堆栈除了用于推送和弹出帧之外,从来没有被直接操作过,所以帧可以被堆分配。” 第15页:2.6:帧:“帧是从创建帧的线程的JVM堆栈中分配的。”在第16页:“请注意,由线程创建的框架是该线程的本地框架,不能被任何其他线程引用。” 这听起来让我很困惑。既然一个帧是创建该帧的线程本地的,为什么要在堆中分配该帧,因为堆在所有J

  • 我一直在试图弄清楚什么时候事情会在堆栈上分配,但我不知道如何让数组(或者更确切地说是数组中的值)在堆栈上分配; 在此示例中: 10个int结构将分配在堆上,只有指向它们的指针将在堆栈上,对吗? 如何制作固定大小的数组以进行堆栈?如果我使用我定义的stucts怎么办? 如果我想数组大小作为参数传递给函数怎么办? 据我所知,如果调用函数时知道大小,那么在调用函数时在堆栈上获取任意大小的数组应该没有问题

  • 我试图了解分配给堆栈和堆的内存量。假设sizeof(char)=1字节,sizeof(void*)=4字节。给定以下代码: 我们被告知分配给堆的内存量是5个字节,我明白这确实是malloc(strlen(str2)=5)中的量。但是,我不明白的是分配给堆栈的内存量是如何达到18个字节的?我想如果他们给我们一个指针大小是4个字节的信息,那么我们有4个字节的指针str1和另外6个字节的数组str2(包

  • 问题内容: 我只知道非基元(对象)放在堆上,方法在堆栈上,但是基元变量呢? -更新 根据答案,我可以说堆可以有一个新的堆,并且给定对象可以堆吗?假设对象将具有基本变量和引用变量。 问题答案: 本地定义的基元将在堆栈中。但是,如果将原语定义为对象实例的一部分,则该原语将位于堆上。 关于更新: 对象没有自己的堆栈。在我的示例中,实际上是的每个实例的一部分。只要分配了HeapClass的实例(例如),就