使用Malloc更改了指针地址

时间:2012-01-10 08:50:02

标签: c

以下是代码段:

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...

为什么会这样?

5 个答案:

答案 0 :(得分:5)

如何管理内存完全取决于您的操作系统。它可以从所有地方分配内存,你绝对不能假设内存的位置。

大多数内存分配器也有一些开销,因此即使是简单的2字节分配也可能占用8个字节或更多。此外,由于多种原因(例如性能,并且因为某些CPU甚至在从未对齐的地址读取时崩溃),可能需要对齐地址。

底线 - 按原样从malloc获取返回值,不做任何猜测或假设。

答案 1 :(得分:2)

它叫做对齐。大多数CPU必须在某些边界上对齐内存,通常是4或8.如果错误对齐地址,则会出现段错误或总线错误。

答案 2 :(得分:1)

malloc()不提供任何此类保证。它只是根据自己的内存管理决策分配一些内存,并返回指向它的指针。实际上,许多实现在指针返回之前使用额外的内存用于内存管理元数据。

答案 3 :(得分:1)

malloc()为您提供底层硬件,操作系统,驱动程序等的抽象。由于各种参数,内存分配模式可能因机器而异。

但以下是关于malloc()

始终保持正确的一些事情
  1. malloc()函数分配size个字节并返回指向已分配内存的指针。
  2. 内存未初始化。
  3. 如果size为0,那么malloc()会返回NULL或一个唯一的指针值,以后可以成功传递给free()
  4. malloc()返回指向已分配内存的指针,该内存适合任何类型的变量。出错时,它会返回NULL
  5. NULL也可能通过成功拨打malloc()来回复,其大小为zero
  6. 另外,您可以使用%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会返回给您。