我有以下功能:
void deleteInventory( struct book** inventory )
{
struct book* ptr = NULL;
ptr = *inventory;
while( length != 0)
{
free(ptr);
length--;
++ptr;
}
free(inventory);
}
Run Code Online (Sandbox Code Playgroud)
结构体:
#define MAX_LENGTH 64
#define ISBN_LENGTH 11
struct book
{
char isbn[ISBN_LENGTH];
char title[MAX_LENGTH];
char author[MAX_LENGTH];
int year;
float price;
};
Run Code Online (Sandbox Code Playgroud)
结构的总大小:147字节(11 + 64 + 64 + 4 + 4)sizeof(结构书)返回:148字节
我的库存变量是结构数组,包含3条记录
现在,在函数中调试的结果(地址没有高2字节):
inventory[0] = 0x1350
inventory[1] = 0x14e0
inventory[2] = 0x1670
Run Code Online (Sandbox Code Playgroud)
内存差异:400字节,好的
在第一次迭代时一切正常,首先记录删除没有问题
但是之后
++ptr;
Run Code Online (Sandbox Code Playgroud)
ptr将包含:0x13e4
inventory [0] - ptr = 148字节 - 根据结构大小校正差异
但它没有引用下一条记录,因为内存中的下一条记录的地址: 0x14e0而且我正在腐败堆.
有什么建议:为什么?
你说这inventory是一个阵列,那没关系.
你已经说过book占用148个字节(当你计算填充时),这没关系.
你没有说过的是你所放置的指针inventory是一次性分配的,而且你有一个指针数组的事实意味着他们不是.
但是你创建了每个books,它似乎是动态的.不能保证这些书是连续的,只是指向它们的指针.
改变你的功能:
void deleteInventory( struct book** inventory )
{
struct book* ptr = NULL;
for (int i = 0; i < length; ++i) {
ptr = inventory[i];
free(ptr);
}
length = 0;
free(inventory);
}
Run Code Online (Sandbox Code Playgroud)
这将读取连续的指针到book数组以删除所有books,而不假设books本身是连续分配的.
我认为你正在删除错误inventory.之后free(ptr)再用下一个内存块ptr可能会是垃圾内存.在这里,我认为是删除您的库存的正确方法:
void deleteInventory( struct book** inventory )
{
book** i = inventory;
while( length != 0)
{
free(*i);
length--;
++i;//notice the difference (++i) instead of (++(*i))
}
free(inventory);
}
Run Code Online (Sandbox Code Playgroud)