Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C (void*)的重要性-1_C_Pointers_Memory_System Calls - Fatal编程技术网

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()
    返回的

  • 在32位机器上是
    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