我有一个结构
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
你知道为什么吗?
答案 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位指针平台上。)