问题标签 [sbrk]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - (char*)-1 是什么意思?
我想知道它(char*)-1
是什么意思,它的评价是什么?
它是sbrk()
发生错误时的返回值。
linux - 使用 sbrk 写入分配的内存会导致段错误
我正在尝试分配内存,sys_brk
这是程序:
sbrk()
以递增字节递增程序的数据空间。以 0 为增量调用sbrk()
可用于查找程序中断的当前位置。
运行程序时出现段错误。segfaulted之前的寄存器内容mov
是:
我还尝试rax
按如下方式递减该值:
现在,我有点困惑如何使用sys_brk
返回值。我从这里拿走了它。我也尝试使用 value inrcx
但无论如何都会出现段错误。
c - 什么是内存中的程序中断?
我正在阅读一篇关于为指针分配空间的文章,该文章并未确切说明“程序中断”是什么,但提到了它。我需要知道程序中断是什么。如果我用 malloc 创建一个指向内存空间的指针..IE
PROGRAM BREAK 是开始还是结束?是 p[0] 还是 p[99] 的地址 THX
linux - sys_brk 的对齐要求是什么
我正在使用 sys_brk 系统调用在堆中动态分配内存。我注意到在获取当前中断位置时,我通常会得到类似于以下的值:
结果是
该值通常以 512 字节对齐。所以想问一下break值有一些对齐要求吗?或者我们可以按照我们想要的方式错位它?
linux - sys_brk 调用返回什么?
你能解释一下什么是程序断点以及在 x86-64 架构上的 Linux 中 sys_brk 调用返回什么。我曾经认为程序的断点是程序地址空间中最后一个有效地址。如果我想扩展它,我必须调用 brk syscall 并为其提供新的断点地址。如果成功,我会取回新的断点,它可能比请求的要大,因为 linux 是按页面操作的。但是我对一些简单代码的行为感到困惑。
首先,我得到了当前的 brk,然后我尝试将它扩展 8 个字节。然后我又得到了当前的 brk。之后,我尝试访问新 brk 上方的内存。结果如下:
如您所见,首先我得到了 22466560 作为当前的 brk;然后 brk 完全按照要求移至 22466568 ;但是linux通常是按页面操作的,所以我又调用了一次brk(0)来检查真正的当前brk,我又得到了22466568。之后我尝试访问高于 22466568 的内存。我只在 22470385 上遇到分段错误。所以我可以访问 brk 上方的 3817 字节(22470385 - 22466568)。
我的问题是为什么我可以访问高于 brk 的内存以及如何获得真正的 brk 点?谢谢。
c - 导入 unistd.h 后,编译器声明 sbrk() 是一个隐式声明。为什么是这样?
我正在尝试malloc
在 CentOS 上实现,但我不断收到错误消息:
这是编译器警告引用的代码:
根据关于 的文档sbrk
,您应该只需要 import unistd.h
,我就是这样做的。有什么我做错了吗?
c - 需要在 C 中实现 malloc 和 free 的建议
对于学校,我需要编写一个使用我自己的 malloc 和 free 实现的程序。我需要能够报告我的“堆”中的所有内存块,无论它是否已分配。我觉得我已经编写了很好的代码来做到这一点,但显然不是。在我运行它的前几次,报告一直在报告同一个地址。在尝试调试时,程序甚至不允许我开始分配空间以用作我的“堆”,它只会出现分段错误并退出。任何关于我哪里出错的指针,甚至是清理我的代码,都会非常有帮助。
c - 如何找到堆栈在C中的结束位置
作为个人项目,我想使用 sbrk(不是 mmap)在 C 中编写自己的 malloc 实现。我知道我可以使用 sbrk(0) 来确定数据段的结束,这将标志着我的堆的结束。但是,我想准确地让我的 malloc 返回 NULL,而不是让我的堆溢出到堆栈中。有没有一种方法可以用来确定堆栈在哪里结束以检测这种情况?
c - 为什么调用 sbrk(0) 两次会给出不同的值?
我试图理解这个sbrk()
功能。
据我所知:
sbrk(0)
返回中断的当前地址并且不增加它。
sbrk(size)
以字节为单位增加中断的地址size
并返回中断的前一个地址。
所以我创建了一些东西来测试它:
所以我期待看到这样的结果:
但相反,我得到了这个:
为什么前两个调用不sbrk(0)
返回相同的值?这两个更改中断地址的调用之间会发生什么?
编辑: 在变量中存储地址可以解决问题:
c - 为什么第一个 sbrk 的返回值与后续调用不同?
我试图了解内存在 C 中是如何工作的,所以现在正在尝试这个sbrk
函数。我知道sbrk(0)
应该返回当前的程序中断,即数据段的结束。
所以我尝试sbrk(0)
多次调用,由于某种原因,我得到的第一个值与其他值不同。例如,这个程序
给我以下输出:
不确定为什么第一个值与其他三个值不同,有什么想法吗?