这两个地址如何不同?

时间:2016-02-02 17:41:27

标签: c pointers memory

我有一个结构

typedef struct    s_block
{
  size_t          size;
  struct s_block  *next;
  struct s_block  *back;
  int             free;
  void            *data;
}                 t_block;

我用这种方式初始化:

int       createHeader()
{
    void  *data;
    data = sbrk(BLOCK_SIZE + (sizeof(t_block) * 2));
    header = data;
    header->next = header;
    header->back = header;
    header->size = 0;
    createNewBlock(data + sizeof(t_block), BLOCK_SIZE + sizeof(t_block), 0);
    return 0;
}

void  *createNewBlock(void *beginAddress, size_t size, int free)
{
  printf("%d\n", size);
  t_block *newBlock;
  printf("first %p\n", beginAddress);
  printf("addr : %p\n", beginAddress + size);
  newBlock = beginAddress;
  newBlock->back = header->back;
  newBlock->next = header;
  newBlock->size = size;
  newBlock->free = free;
  newBlock->data = beginAddress + sizeof(t_block);
  header->back->next = newBlock;
  header->back = newBlock;
  header->size++;
  show_alloc_mem();
  return newBlock->data;
}

当我在beginAddress中显示createNewBlock时,给出的地址是好的,当我显示beginAddress + size的地址时,它会给我正确的地址:

140
first 0x18f9028
addr : 0x18f90b4

但是当我输入我的函数show_alloc_mem()

void show_alloc_mem()
{
  t_block *tmp;

  tmp = header->next;
  printf("break : %p\n", header);
  while (tmp != header)
  {
    if (tmp->free == 1)
      printf("%p - %p : %d bytes\n", tmp, tmp + tmp->size, (int)tmp->size);
    else
      printf("free: %p - %p : %d bytes\n", tmp, tmp + tmp->size, (int)tmp->size);
    tmp = tmp->next;
  }
}

发生了奇怪的行为。 标题地址和tmp地址是正确的。但tmp + size的地址不是

break : 0x18f9000
free: 0x18f9028 - 0x18fa608 : 140 bytes

你知道为什么吗?

2 个答案:

答案 0 :(得分:3)

您正在执行指针运算,期望它的行为类似于整数运算。

表达式tmp + tmp->size的计算结果为(int)tmp + sizeof(t_block)*( (int)tmp->size ),因为您要将一个整数(tmp->size)添加到指向结构的指针(tmp的类型为t_block* })。

答案 1 :(得分:2)

您使用两种不同的指针算法:

  • 一个void *
  • 一个t_block *

您的编译器允许您对void *进行算术运算,但它被排除在标准之外。有些编译器(你的)在void *上使用自然算术,所以在第一个表达式中它计算BaseAdressValue+size,而在第二个BaseAddressValue+40*size中(40是你的大小)结构,五个8字节指针,你在64位指针平台上。)