sizeof错误的结果

时间:2015-01-25 18:05:40

标签: c debugging

我这里有一个非常奇怪的问题:

typedef struct        s_mem_chunk
{
  void                *addr;
  unsigned int        size;
  short               is_alloc;
  struct s_mem_chunk  *prev;
}                     t_mem_chunk;

#include <stdio.h>
#include <stdlib.h>

int main()
{
  t_mem_chunk *mem_chunk;

  mem_chunk = malloc(sizeof(*mem_chunk));
  mem_chunk->prev = 0;

  printf("%x + %x = %x\n", mem_chunk->prev, sizeof(*mem_chunk), mem_chunk->prev + sizeof(*mem_chunk));
  return 0;
}

所以这里的代码应输出: “0 + 18 = 18” 它输出“0 + 18 = 240”

所以我想知道为什么,这可能是由于我不知道的大小... 我请求你的帮助,提前感谢你的时间,祝你有个美好的夜晚! :d

2 个答案:

答案 0 :(得分:4)

你误解了0 + 18 = 240,这是正确的结果!

0是mem_chunk->prev的值。 18是你结构的大小;请注意这是六进制。

你有指针算术,所以mem_chunk->prev + sizeof(*mem_chunk)像往常一样不是0 + 18,而是从0开始的数组的第19个假设元素的地址。所以0x18 * 0x18 = 0x6中的0x240。在指针运算中,向指针添加数字可计算移动; int用作指针的距离,距离的单位是指针指向的对象的类型。如果您向int指针添加1,则在之后计算内存地址int ...

在你的情况下: mem_chunk->prev+1不是10x18mem_chunk->prev+2不是2,而是0x30

另请注意格式并使用%p作为指针,使用%lx(C99中为%zx)sizeof返回long int

答案 1 :(得分:2)

您的程序调用未定义的行为。

x转换说明符需要类型为unsigned int的参数,但mem_chunk->prev是指针值。 mem_chunk->prev + sizeof(*mem_chunk)相同,它不执行整数运算,但指针运算并产生无效指针。