- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用以下代码创建一个新节点并将其插入到链表中,随后释放它们。
// the node
struct node
{
int data;
struct node *next;
};
// returns a pointer to a new node with data
struct node *new_node(int data)
{
struct node *node;
node = malloc(sizeof(struct node));
node->data = data;
node->next = NULL;
return node;
}
// insert node at front of list
void push(struct node **head, int data)
{
struct node *node = new_node(data);
node->next = *head;
*head = node;
}
// free the list, deallocate each node's memory
void delete_list(struct node** head)
{
if(*head == NULL)
return;
struct node *next = NULL;
next = (*head)->next;
while(next != NULL)
{
next = (*head)->next;
// print address of the memory released
printf("Freeing %d\n", (int)*head);
free(*head);
*head = next;
}
}
现在,该结构在我的机器中为 8 字节(4 字节 int
和 4 字节指针)。现在,我对以下内容有点不确定,所以请帮助我:
当我调用 push()
按顺序,内存是连续分配的吗?总是这样吗?我想这不可能,因为堆中的内存可能会碎片化。
假设分配的内存是连续的,那么它会间隔 8 个字节吗,因为 struct
的大小是 8 个字节。在我的机器上,当我打印被释放内存的地址时,打印的内存地址在每次执行时相隔 16 个字节。为什么?
Freeing 148025480
Freeing 148025464
Freeing 148025448
Freeing 148025432
Freeing 148025416
Freeing 148025400
Freeing 148025384
Freeing 148025368
Freeing 148025352
<empty list>
现在如果内存没有为我们的整数数组连续分配(堆非常碎片化,内存需求非常大),我们使用指针算法通过递增地址来处理数组的每个元素每次增加 4(或者 int
的大小),难道我们不应该遇到一些没有被我们的程序保留的内存,从而退出程序吗?或者运行时环境是否足够智能来处理这个问题,因为编译器不能,因为它不知道如何分配内存。操作系统会处理这个吗?
最佳答案
每次调用 new_node
时,它都会调用 malloc()
。
您不能(或不应该)预测 malloc()
会在哪里找到您的内存。它依赖于操作系统和运行时。
在特定的操作系统上运行,在某些情况下,您可能会观察到连续调用 malloc()
的分配是连续的。然而,这种行为可能会在负载下发生变化,或者随着内核更新、libc 实现的变化或在各种其他条件下发生变化。
您可以假设通过一次调用 malloc()
分配的内存块是连续的(至少,就您的程序所见的指针而言)。您的程序不应假设任何其他有关连续性的内容。
如果这真的困扰您,您可以在自己的代码中负责更多的内存管理——而不是为每个节点调用 malloc()
,而是在开始时调用它并获得一个更大的内存块。对 new_node 的后续调用可以使用该 block 的一部分。如果该 block 中的空间不足,您可以 malloc()
另一个 block (可能不会与第一个 block 连续)或 realloc()
来扩展(并可能移动)它。
您可能会发现,所有这些都会让您的代码变得更加复杂——至于是否有好处可以抵消这种情况,则取决于您。 Hotspot Java VM 的作者基本上是这样做的——他们在执行开始时 malloc()
一大块内存,然后调用 malloc()
和 free()
当 Java 程序需要内存时,它会使用自己的例程来分配该 block 的各个部分。
关于c - 堆内存 : Gap of 16 bytes for 8 byte struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24535618/
我在《C 编程语言第二版》中读到了以下代码 /* shellsort: sort v[0] ... v[n-1] into increasing order */ void shellsort(int
如何更改GAP中的当前目录? ?我写道: gap> ChangeDirectoryCurrent("Users/anymuanalifah/Documents") 然后我收到一个错误。如果重要的话,我
我有一个关于列表中漏洞的问题。假设我有以下代码: gap> l:=[2,3,,5]; [ 2, 3,, 5 ] gap> for i in [1..Size(l)] do > Print(l[i],"
例如,当我从命令行启动脚本时,我想了解 GAP 的行为 $ gap mytest.gap 而不是从 GAP 内部调用它 gap> Read("mytest.gap"); 特别是,我试过 suppres
最低工作示例: x:=Indeterminate(Rationals,"x"); f:=Sum([1..1000],i->x^i); PrintTo("~/temp.txt",f); 它打印到 tem
我是 phone gap 的新手。我在 config.xml 中遇到错误。实际上我正在做 paypal 集成。 在 config.xml 中显示未绑定(bind)电话间隙命名空间。 当我运行时显示错误
有没有办法将单个 grid-row-gap 设置为不同于网格其余部分的特定大小? 用例:网格的第一行到第二行的间隙应该小于网格的其余部分,因为它充当标题。 最佳答案 grid-row-gap 和 gr
我有一个包含三个图像和一个文本部分的网格。我有网格的列和行间隙,如果我有所有三个图像,它就可以正常工作。但是,如果缺少任何图像,我仍然会得到缺少的列或行的列或行间隙。如果行或列不存在,是否有任何方法可
上周我一直在尝试解决堆栈溢出问题,但我仍然无法找到可行的解决方案,所以想知道是否有人可以为我提供一些帮助/建议? 数据结构说明 我有下表: 位置表(zz_position),用于保存详细信息职位(职位
当我玩入门练习“在 native Android 应用程序中使用 Worklight API”时,我无法从 native Android 页面连接到 Worklight 服务器,错误消息如下: Una
在计算 Tibshirani 的差距统计量时,引用分布中是否有推荐数量的模拟数据集 (B)? B=50? B=100? B=500? B=1000?如果是这样,有什么好的引用资料提到它吗? 最佳答案
我有一个 php 数组(通过表单中的复选框值获得 - 如您所知,复选框仅在未设置时显示在 _POST 变量中)。 Array ( [2] => 0,2 [3] => 0,3 ) 我需要
我正在尝试通过使用辅助表来填补使用组后的空白,你能帮忙吗? 处理没有订单的日子的辅助表 date quantity 2014-01-01 0 2014-01-02 0 2014-01
我试图通过使用辅助表来填补使用组后的空白,你能帮忙吗? 用于处理无订单天数的辅助表 date quantity 2014-01-01 0 2014-01-02 0 2014-01-0
你能告诉我如何去除红线和导航栏之间的白色间隙吗?CSS: /* Main */ #menu{ width: 100%; margin: 0; padding: 10px 0 0 0;
所以我创建了一个导航栏,并且它可以与水平导航一起使用。然而,我在导航栏之间有这些“间隙”,如下图所示,但我仍然可以在这些间隙之间单击。 这是 JSFiddle(SCSS 不起作用,所以我使用编译后的
在下面的 jsfiddle 中,我在第 2 行和第 3 行之间有一个空隙,我猜这是由于 CSS,但我不确定它为什么存在以及如何摆脱它。 如果我将第二行移到最后一行,间隙就会消失,但我想保持当前的行顺序
我创建了这个网站: https://jsfiddle.net/1pvk13o8/ 我正在使用 jquery masonry,一切似乎都很好,但有些行之间有空白或空洞,有什么帮助吗?我希望一切都按应有的
我有一个如下表,其中 X 列是给定开始和结束期间的商品价格。 X START_DATE END_DATE ------------------------------ 1 0
这个问题在这里已经有了答案: pandas or python equivalent of tidyr complete (4 个答案) 关闭 12 个月前。 我在寻找 pandas 数据框中的空白
我是一名优秀的程序员,十分优秀!