(void *)-1的意义

时间:2016-07-24 09:09:18

标签: c pointers memory system-calls

我查看了sbrk系统调用的文档,找到了this

  

成功时,sbrk()返回上一个程序中断。 (如果中断增加,则此值是指向新分配的内存的开始的指针)。如有错误,系统会返回(void *) -1errno设置为ENOMEM

现在,

  1. (void *) -1的重要性是什么?

  2. 它指向的确切内存地址是什么? (如果有的话)

  3. 如何保证(void *) -1不是有效地址 sbrk()成功后可以退回吗?

2 个答案:

答案 0 :(得分:6)

#!/usr/bin/env python

import scipy.misc
import numpy as np

# Image size
width = 640
height = 480
channels = 3

# Create an empty image
img = np.zeros((height, width, channels), dtype=np.uint8)

# Draw something (http://stackoverflow.com/a/10032271/562769)
xx, yy = np.mgrid[:height, :width]
circle = (xx - 100) ** 2 + (yy - 100) ** 2

# Set the RGB values
for y in range(img.shape[0]):
    for x in range(img.shape[1]):
        r, g, b = circle[y][x], circle[y][x], circle[y][x]
        img[y][x][0] = r
        img[y][x][1] = g
        img[y][x][2] = b

# Display the image
scipy.misc.imshow(img)

# Save the image
scipy.misc.imsave("image.png", img)

在32位计算机上为(void *) -1 == (size_t) -1 ,在64位计算机上为0xFFFFFFFF,无效地址应该比任何其他地址都大。

答案 1 :(得分:2)

  
      
  1. (void *) -1的重要性是什么?
  2.   

它只是一个sbrk()无法在成功案例中返回的哨兵价值。

  
      
  1. 它指向的确切内存地址是什么? (如果确实如此)
  2.   

预计它不是有效地址,具体值不相关。

  
      
  1. 如何确保(void *) -1不是sbrk()成功时可以返回的有效地址?
  2.   

它可能看起来像循环推理,但它得到保证,因为sbrk()保证它是合同的一部分。 (例如,如果成功,sbrk()可以检查 是否会返回该值;如果成功,它将无效并报告失败。)

在实践中,大多数现代机器上的(void*) -1将是0xFF...FF,这将是最高可能的地址,并且这只是一些不太可能有效的地方