以下是代码段:
void main() {
int i,*s;
for(i=1;i<=4;i++) {
s=malloc(sizeof(int));
printf("%lu \n",(unsigned long)s);
}
}
我的comp上int的大小是2个字节,所以printf命令打印地址不应该增加16位,而是将地址打印为:
2215224120
2215224128
2215224136...
为什么会这样?
答案 0 :(得分:5)
如何管理内存完全取决于您的操作系统。它可以从所有地方分配内存,你绝对不能假设内存的位置。
大多数内存分配器也有一些开销,因此即使是简单的2字节分配也可能占用8个字节或更多。此外,由于多种原因(例如性能,并且因为某些CPU甚至在从未对齐的地址读取时崩溃),可能需要对齐地址。
底线 - 按原样从malloc获取返回值,不做任何猜测或假设。
答案 1 :(得分:2)
它叫做对齐。大多数CPU必须在某些边界上对齐内存,通常是4或8.如果错误对齐地址,则会出现段错误或总线错误。
答案 2 :(得分:1)
malloc()
不提供任何此类保证。它只是根据自己的内存管理决策分配一些内存,并返回指向它的指针。实际上,许多实现在指针返回之前使用额外的内存用于内存管理元数据。
答案 3 :(得分:1)
malloc()
为您提供底层硬件,操作系统,驱动程序等的抽象。由于各种参数,内存分配模式可能因机器而异。
但以下是关于malloc()
malloc()
函数分配size
个字节并返回指向已分配内存的指针。 size
为0,那么malloc()
会返回NULL
或一个唯一的指针值,以后可以成功传递给free()
。malloc()
返回指向已分配内存的指针,该内存适合任何类型的变量。出错时,它会返回NULL
。NULL
也可能通过成功拨打malloc()
来回复,其大小为zero
另外,您可以使用%p
格式说明符来打印指针
我修改了程序如下
#include <stdlib.h>
int main(void) {
int i,*s;
printf("sizeof(int) = %zu \n", sizeof(int));
for(i=1;i<=4;i++) {
if ((s=malloc(sizeof(int))) == NULL) {
printf("unable to allocate memory \n");
return -1;
}
printf("%p \n",s);
}
return 0;
}
输出如下:
$ ./a.out
sizeof(int) = 4
0x9d5a008
0x9d5a018
0x9d5a028
0x9d5a038
$
答案 4 :(得分:0)
您无法保证地址模式malloc
会返回给您。