我的一个指针在我尊重它之后被改变并且影响它一个值.我不明白为什么,特别是因为该函数中的代码多次运行但大部分时间都在运行.这是代码:
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)
从您的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
字段本身的较高部分重叠.
如果你打算做地址运算时,尽量使用编译器提供的内省机制,如sizeof
和offsetof
尽可能.它们可以减少此类错误的发生率,并使代码更具可读性和便携性.
(或者,更好的是,完全避免地址算术).