在引用指针实现后意外指针发生变化

Rog*_*ger 1 c pointers

我的一个指针在我尊重它之后被改变并且影响它一个值.我不明白为什么,特别是因为该函数中的代码多次运行但大部分时间都在运行.这是代码:

typedef struct          s_freeList
{
  int                   sSize;
  struct s_freeList     *next;
  struct s_freeList     *back;
  int                   *eSize;
}                       t_freeList;

void            *addNode(void *addr, size_t size)
{
  t_freeList    *freeList;

  // Working stuff
  freeList = (t_freeList *)addr;
  freeList->sSize = size * -1;
  freeList->next = ((t_freeList *)g_startAddr)->next;
  freeList->back = g_startAddr;
  ((t_freeList *)g_startAddr)->next->back = freeList;
  ((t_freeList *)g_startAddr)->next = freeList;

  // Not working stuff
  printf("addr = %p\nsize = %d\n", addr, (int)size);
  freeList->eSize = addr + size - 4;
  printf("freelist->esize = %p\n", freeList->eSize);
  *(freeList->eSize) = size * -1;
  printf("freelist->esize = %p\n\n", freeList->eSize);

  return (collapseNodes(addr));
}
Run Code Online (Sandbox Code Playgroud)

这是输出的地址:

addr = 0x1647020
size = 32
freelist->esize = 0x164703c
freelist->esize = 0xffffffe00164703c
Run Code Online (Sandbox Code Playgroud)

atz*_*tzz 5

从您的printf输出,您运行在具有64位指针的平台上.每个指针都有大小,重要的是,8个字节的自然对齐,这给出了结构的以下布局(偏移量为十进制):

  00    sSize;
  04    <padding>
  08    *next;
  16    *back;
  24    *eSize;
  32    <total size>
Run Code Online (Sandbox Code Playgroud)

你正在设置freeList->eSize = addr + size - 4,size = 32恰好恰好与eSize字段本身的较高部分重叠.

如果你打算做地址运算时,尽量使用编译器提供的内省机制,如sizeofoffsetof尽可能.它们可以减少此类错误的发生率,并使代码更具可读性和便携性.

(或者,更好的是,完全避免地址算术).