我查看了sbrk
系统调用的文档,找到了this:
成功时,
sbrk()
返回上一个程序中断。 (如果中断增加,则此值是指向新分配的内存的开始的指针)。如有错误,系统会返回(void *) -1
,errno
设置为ENOMEM
。
现在,
(void *) -1
的重要性是什么?
它指向的确切内存地址是什么? (如果有的话)
如何保证(void *) -1
不是有效地址
sbrk()
成功后可以退回吗?
答案 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)
- 醇>
(void *) -1
的重要性是什么?
它只是一个sbrk()
无法在成功案例中返回的哨兵价值。
- 它指向的确切内存地址是什么? (如果确实如此)
醇>
预计它不是有效地址,具体值不相关。
- 如何确保
醇>(void *) -1
不是sbrk()
成功时可以返回的有效地址?
它可能看起来像循环推理,但它得到保证,因为sbrk()
保证它是合同的一部分。 (例如,如果成功,sbrk()
可以检查 是否会返回该值;如果成功,它将无效并报告失败。)
在实践中,大多数现代机器上的(void*) -1
将是0xFF...FF
,这将是最高可能的地址,并且这只是一些不太可能有效的地方