- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
所以我知道在堆栈中分配的变量上调用 free()
会导致无效指针错误。
在 malloc
ed 指针中,malloc()
在实际指针之前分配 8 个字节以留下有关其大小的信息。所以我想知道我是否在结构之前制作了一个 long
,然后在该结构上调用 free 是否有可能释放该结构(当然这是假设那些分配8 个字节是 malloc
所做的唯一额外的事情。
我想我的最后一个问题是堆栈变量分配和堆分配之间是否存在任何真正的区别(就后端调用内核而言)。
最佳答案
某些 C 实现可能会在分配空间之前使用数据来帮助它们管理空间。有些没有。有些人这样做是为了分配某些大小而不是其他人。如果他们这样做,它可能是八个字节,或者可能是其他数量。您不应依赖这方面的任何行为。
当你声明一个 long
对象和一个 struct
block 中的某种类型,编译器可能会也可能不会将它们彼此相邻地放在堆栈上。它可能会把 long
在 struct
之前反之亦然,或者,因为它优化了您的程序,它可能会保留 long
在一个寄存器中并且永远不要将它放在堆栈中,它可能会做其他事情。在一些C
实现,一个long
是八个字节。在某些情况下,事实并非如此。没有什么好的方法可以确保将两个单独的对象放在相邻的内存中。 (您可以通过将它们放在更大的结构中来使它们不分离。)
即使您能够拼凑出 long
其次是 struct
, 你怎么知道要将什么值放入 long
? C 实现是否将分配的长度放在那里?或者它是指向另一个 block 的指针?或者 C 实现用于跟踪分配的内存的数据库的其他部分?如果malloc
和 free
正在分配空间之前使用内存,该内存不为空。它需要有一些值(value),而你不知道那是什么。
如果幸运的话,传递 struct
的地址至 free
可能不会立即使您的程序崩溃。但是从某种意义上说,你已经释放了堆栈的一部分。当您调用 malloc
同样,您返回的指针可能指向该内存,然后您的程序可能会写入该空间。那么当您的程序调用其他例程时会发生什么,导致堆栈增长到该空间?您将重叠使用同一内存。您的某些数据将覆盖其他数据,您的程序将无法运行。
是的,在栈上分配的内存和从堆上分配的内存是有区别的。这在 C 呈现给您的程序的模型之外。但是,在进程具有堆栈和堆的系统中,它们通常位于进程内存中的不同位置。特别是,堆栈内存必须在堆栈增长和收缩时保持可用。你不能在不破坏东西的情况下将它与堆混合。
当你尝试不同的事情时,问一些关于会发生什么的问题是很好的。但是,malloc
的现代实现和 free
非常复杂,您几乎必须接受它们作为您无法轻易查看的服务。相反,为了帮助您学习,您可能会考虑以下内容:
你会如何编写自己的 malloc
和 free
?
使用malloc
编写一些分配大量内存的代码,比如一兆字节,并编写两个名为 MyMalloc
的例程和 MyFree
像malloc
一样工作和 free
,除非他们使用您分配的内存。当MyMalloc
被调用时,它会开辟出一 block 内存。当MyFree
被调用时,它将返回 block 以使其再次可用。
编写一些随机调用 MyMalloc
的实验代码各种尺寸和MyFree
,顺序有点随机。
您如何才能完成所有这些工作?你如何将兆字节分成 block ?您如何记住哪些 block 已分配,哪些 block 是空闲的?当有人调用 MyFree
, 你怎么知道他们回馈了多少?当用 MyFree
返回相邻 block 时,如何将它们重新组合成更大的 block ?
关于c - 释放堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47879220/
出于好奇 - 我知道有 LAMP - Linux、Apache、MySQL 和 PHP。但是还有哪些其他 Web 堆栈替代方案的缩写呢?像 LAMR - Linux、Apache、MySQL Ruby
我有以下代码。 var stackMapIn = []; var stackMapOut = []; var stackBack = []; stackMapOut.push("m1"); $scop
我遇到了导致我的堆栈无法恢复的情况,我别无选择,只能将其删除。使用完全相同的模板,我继续创建了另一个同名的堆栈。 The following resource(s) failed to create:
这是我第一次查看 Node 堆栈,自从我学习使用 Ruby on Rails 进行 Web 开发以来,我对一些基本的东西有点困惑。我了解 Rails 目录是什么样的。 demo/ ..../app .
本文实例讲述了C语言使用深度优先搜索算法解决迷宫问题。分享给大家供大家参考,具体如下: 深度优先搜索 伪代码 (Pseudocode)如下: ?
我正在按照指南 here ,它告诉我: The stack setup will download the compiler if necessary in an isolatedlocation (
同时 trying to debug a different question ,我安装了一个似乎与我安装的其他一些软件包冲突的软件包。 我跑了 $ stack install regex-pcre-
我花了几个小时创建了一个方法,该方法将从堆栈 s1 中获取 null 元素,并将它们放入 s2 中。然后该类应该打印堆栈。方法如下 import net.datastructures.ArraySta
我有一个类Floor,它有一个Stack block ,但我不知道如何初始化它。我曾尝试过这样的: public class Floor { private Stack stack;
我知道这个问题已经问过很多次了,但搜索一个小时后我仍然遇到问题。 我想使用一个 lifo 堆栈,它可以存储最大数量的元素。达到最大数量后,首先删除该元素并将其替换为新元素,这样在第一次弹出时我可以获取
我需要编写一个方法,压缩以执行以下操作; 目标compress方法是从栈s1中移除所有null元素。剩余(非空)元素应按其初始顺序保留在 s1 上。辅助堆栈 s2 应用作s1 中元素的临时存储。在该方
我正在尝试验证以下代码发生的顺序。 function square(n) { return n * n; } setTimeout(function(){ console.log("H
我需要一个字符数组,其中包含基于特定文件夹中文件数量的动态数量的字符数组。我能够通过初始化 char (*FullPathNames)[MAX_FILENAME_AND_PATHNAME_LENGTH
我正在编写一些日志逻辑并想要进行一些缩进。了解是否存在任何函数调用或某个函数是否已完成的最简单方法是查看堆栈/帧的当前地址。让我们假设堆栈颠倒增长。然后,如果 log() 调用中的堆栈地址小于前一次调
所以内存分段在x86-64中被放弃了,但是当我们使用汇编时,我们可以在代码中指定.code和.data段/段,并且还有堆栈指针寄存器。 还有堆栈段、数据段和代码段寄存器。 代码/数据/堆栈的划分是如何
void main() { int x = 5; // stack-allocated Console.WriteLine(x); } 我知道 x 是堆栈分配的。但是关于 x 的堆栈中
这是我关于 SO 的第一个问题。这可能是一个愚蠢的问题,但到目前为止我还没弄明白。 考虑下面的程序 Reader.java: public class Reader { public
java中有没有一种快速的方法来获取嵌套/递归级别? 我正在编写一个函数来创建组及其成员的列表。成员也可以是团体。我们最终可能会得到一组循环的组/成员。 我想在某个任意级别停止。 我知道我可以将变量保
考虑以下代码: struct A{...}; A a[100]; A* pa = new A[100]; delete[] pa; a/pa 元素的销毁顺序是由标准定义的还是实现定义的(对于第二种情况
我在下面有一些代码。此代码是一个基本的压入/弹出堆栈类,我将其创建为模板以允许某人压入/弹出堆栈。我有一个家庭作业,我现在要做的是创建一个具有多个值的堆栈。 所以我希望能够创建一个基本上可以发送三个整
我是一名优秀的程序员,十分优秀!