我想知道是否可以保证内存地址是正整数
任何硬件工程师都会将内存地址视为正数。
但在C编程中,这毫无意义。在编程中,我们有指针,它们不是整数。它们是一些可打印的位模式(实现定义)。打印指针可以让你
FFFFFFFF00112233
你可以随心所欲地把它看作是正的或负的,但这没有意义。根据C标准,它们不是整数,因此既不是正的也不是负的。
您可以将指针转换为intptr\u t
和uintprt\u t
。它们分别是有符号和无符号的。所以你能得到的范围取决于你想要什么。
在C(和C)中,整数和指针(对象的内存地址,通用形式:void*
)类型之间有明显的区别。
这两种类型都是兼容类型,属于同一组,即标量类型。
类型ptrdiff_t
是减去两个指针时返回的有符号整数类型。自C99/C 11以来,随着固定宽度整数类型的引入,我们还有类型intptr__t
和uintpr_t
,能够容纳指针的整数类型。
总之,如果你说的是地址(指针),你不是在说整数类型。因为两者都是标量类型,所以它们彼此兼容,因此(在某些情况下)可以互换。但从来都不平等。因此,我认为你的问题毫无意义。
参考:
你对问题进行了一半的编辑,在某种程度上改变了它的解释。我将回答这两个版本。
我想知道是否可以保证内存地址是正整数
至少在C和C语言中,内存地址是内存地址——它不一定是整数。在这些语言中,内存地址(指针)和整数之间的转换是有问题的,它们需要显式转换,并且不能保证它们总是有效。然而,如果我们确实认为内存地址是整数,我们总是认为它们是无符号整数,这意味着它们在几乎任何平台上都不能是负的。
我想知道在intptr\u t
啊哈。完全不同的问题intptr_t
是一种有符号类型,所以现在我们想知道的是,基本上,在地址空间的“上半部分”中是否有地址,这意味着它们有其高阶(最高有效)位集,这意味着如果我们将它们视为有符号类型,它们将被解释为负数?
当我第一次在16位PDP-11上学习C时,堆栈位于地址空间的顶部,从地址0xffff
或-1开始,所以是的,我看到了很多“负”地址,通常是任何堆栈地址。(在那些日子里,我们没有intptr_t
,但如果我们把它们当作有符号整数处理,我们确实有看起来是负数的地址。)
当Unix第一次移植到32位VAX时,从那时起,大多数/所有32位版本的Unix和Linux都使用AFAIK,用户内存被限制在虚拟内存地址空间的“下半部分”,而操作系统本身被映射到上半部分。所以在这些平台上,用户地址看起来总是正面的,我猜这就是你要问的。
我不知道Windows是如何操作的,我也不知道现代64位操作系统(如果你的操作系统设置为支持32位或64位程序,就更不用说了)上的东西通常是如何布置的。
所以我真的帮不了你填桌子。当然,不能保证用户地址在转换为intptr\t
时始终为正。如果你希望得到这样的保证,如果你正在考虑编写一个利用它的程序,我强烈建议你重新考虑,如果可能的话。
(多年来,出于各种“聪明”的原因,各种“聪明”的程序试图篡夺指针变量的一位或多位,作为自己目的的标志,因为它们知道这些位碰巧对那天的实际指针地址来说微不足道。尽管这些程序可能在短期内获得了性能提升,但根据我的经验,这些技巧最终总是会失败。我会像躲避瘟疫一样躲避它们。)
问题内容: 我正在尝试打电话 直接,但获得EFAULT错误代码。出现此错误是因为 buf 指向内核空间中的内存。 那么,是否有可能从内核分配用户空间内存? 与 内核内存相似并返回指向内核内存的指针。 问题答案: 您可以使用以下方法临时禁用内存地址有效性检查:
问题内容: 我的问题是关于将数据从内核传递到用户空间程序。我想实现一个系统调用“ get_data(size,char * buff,char ** meta_buf)”。在此调用中,buff由用户空间程序分配,并且其长度在size参数中传递。但是,meta_buf是可变长度的缓冲区,已分配(在用户空间程序的vm页面中)并由内核填充。用户空间程序将释放该区域。 (我无法在用户空间中分配数据,因为用
问题内容: 有没有办法从linux中的用户空间分配连续的物理内存?至少有几个保证的连续内存页。一个巨大的页面不是答案。 问题答案: 不,那里没有。您 确实 需要在内核空间中执行此操作。 如果您说“我们需要从用户空间执行此操作”-没有在内核空间中进行任何操作,那没有什么意义-因为用户空间程序无法控制 甚至不知道 底层内存是否连续。 您需要执行此操作的唯一原因-是与某个硬件或其他需要此要求的低层(即内
地址空间 分段机制涉及5个关键内容:逻辑地址(Logical Address,应用程序员看到的地址,在操作系统原理上称为虚拟地址,以后提到虚拟地址就是指逻辑地址)、物理地址(Physical Address, 实际的物理内存地址)、段描述符表(包含多个段描述符的“数组”)、段描述符(描述段的属性,及段描述符表这个“数组”中的“数组元素”)、段选择子(即段寄存器中的值,用于定位段描述符表中段描述符表
问题内容: 我的应用程序中有一堆缓冲区(其中25到30个),它们很大(.5mb),可以同时访问simulataneousley。更糟糕的是,它们中的数据通常只读取一次,并且经常更新(例如每秒30次)。某种非最佳缓存使用的完美风暴。 无论如何,我想到,如果我可以将内存块标记为不可缓存,那将是很酷的……从理论上讲,这将为其他所有内容在缓存中留出更多空间。 那么,他们是否有办法获得在Linux中标记为不
我有来自Microsoft Azure数据中心(http://www.microsoft.com/en-us/download/confirmation.aspx?id=41653)的900个IP地址范围,我想知道IP地址是否来自其中一个地址。我已经把它转换成一个列表,可以存储在文本文件中。 所以:循环遍历每个地址并使用ip2long()如这里的第3点是否成本更高(https://mebsd.co