sizeof 的错误结果

Wrong result with sizeof

我遇到了一个非常奇怪的问题:

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”

所以我想知道为什么,这可能是由我不知道的 ot 大小引起的... 我请求你的帮助,提前感谢你的时间,祝你晚上愉快! :D

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

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

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

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

你有指针算法,所以mem_chunk->prev + sizeof(*mem_chunk)不是通常的0+18,而是假设的从0开始的数组的第19个元素的地址。所以 0x18*0x18=0x240 为六进制。在指针算术中,将一个数字加到一个指针上计算出一个移动; int 用作与指针的距离,距离的单位是指针指向的对象的类型。如果给一个int指针加1,那么在...

之后计算内存地址一个int

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

还要注意格式,对指针使用%p,对sizeof which returns a long int使用%lx(C99中的%zx)。