C (void*)的重要性-1
我在查看C (void*)的重要性-1,c,pointers,memory,system-calls,C,Pointers,Memory,System Calls,我在查看sbrk系统调用的文档时发现: 成功后,sbrk()返回上一个程序中断。(如果中断时间增加,则该值是指向新分配内存开始的指针)。出现错误时,返回(void*)-1,并将errno设置为ENOMEM 现在, (void*)-1的意义是什么 它指向的确切内存地址是什么?(如果有) 如何保证(void*)-1不是有效地址 成功时可以通过sbrk()返回的 在32位机器上是0xFFFFFFFF,在64位机器上是0xffffffffffff,这是一个无效地址,应该比任何其他地址都大 在32位机器上
sbrk
系统调用的文档时发现:
成功后,sbrk()
返回上一个程序中断。(如果中断时间增加,则该值是指向新分配内存开始的指针)。出现错误时,返回(void*)-1
,并将errno
设置为ENOMEM
现在,
(void*)-1
的意义是什么(void*)-1
不是有效地址
成功时可以通过sbrk()
返回的0xFFFFFFFF
,在64位机器上是0xffffffffffff
,这是一个无效地址,应该比任何其他地址都大
在32位机器上是0xFFFFFFFF
,在64位机器上是0xffffffffffff
,这是一个无效地址,应该比任何其他地址都大
(void*)-1
的意义是什么sbrk()
在成功案例中无法返回
(void*)-1
不是一个有效的地址,成功后sbrk()
可以返回该地址sbrk()
保证它是合同的一部分。(例如,sbrk()
可以检查如果成功,它是否会返回该值;如果成功,它将什么也不做并报告失败。)
实际上,在大多数现代机器上,(void*)-1
将是0xFF…FF
,这将是可能的最高地址,这是不可能有效的
(void*)-1
的意义是什么sbrk()
在成功案例中无法返回
(void*)-1
不是一个有效的地址,成功后sbrk()
可以返回该地址sbrk()
保证它是合同的一部分。(例如,sbrk()
可以检查如果成功,它是否会返回该值;如果成功,它将什么也不做并报告失败。)
实际上,在大多数现代机器上,
(void*)-1
将是0xFF…FF
,这将是可能的最高地址,而这只是一些不太可能有效的东西。我很抱歉,如果我听起来完全是noob,但是(void*)-1
如何等于0xffffff
@tomol,请阅读@tomol,从另一个方向考虑,多少钱是0xFFFFFFFF+1
?这是0
!。。。一旦变量因其位大小限制而溢出,就会发生有趣的事情;-)@马特,你错了。C标准没有提到任何关于tomol的内容,然而编译的C
程序并不是在真空中运行的。像Llinux内核这样的具有体系结构意识的东西,可以安全地说0xffffff
是-1
如果我听起来完全没有意思,我很抱歉,但是(void*)-1
如何等于0xffffff
@tomol,读一下@tomol,从另一个方向想一想,0xFFFFFFFF+1
?这是0
!。。。一旦变量因其位大小限制而溢出,就会发生有趣的事情;-)@马特,你错了。C标准没有提到任何关于tomol的内容,然而编译的C
程序并不是在真空中运行的。像Llinux内核这样的具有体系结构意识的东西,可以安全地说0xffffff
是-1
,而且即使0xFF..FF
是一个有效地址,对于具有sbrk
系统调用的系统来说,这是内核空间中的一个地址,在用户模式下是无法访问的。从技术上讲,sbrk
可以将内核空间中的任何地址返回给用户模式代码以指示错误。此外,即使0xFF..FF
是有效地址,对于具有sbrk
系统调用的系统来说,这是内核空间中的地址,在用户模式下无法访问。从技术上讲,sbrk
可以将内核空间中的任何地址返回给用户模式代码,以指示错误。
(void *) -1 == (size_t) -1