【发布时间】:2013-12-10 19:27:03
【问题描述】:
我有以下功能:
void deleteInventory( struct book** inventory )
{
struct book* ptr = NULL;
ptr = *inventory;
while( length != 0)
{
free(ptr);
length--;
++ptr;
}
free(inventory);
}
结构:
#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;
};
结构总大小:147 字节 (11 + 64 + 64 + 4 + 4) sizeof(struct book) 返回:148 字节
我的库存变量是结构数组,包含 3 条记录
现在,函数中的调试结果(没有高2字节的地址):
inventory[0] = 0x1350
inventory[1] = 0x14e0
inventory[2] = 0x1670
内存差异:400字节,OK
第一次迭代一切正常,第一条记录删除没有问题
但是之后
++ptr;
ptr 将包含:0x13e4
inventory[0] - ptr = 148 bytes - 根据结构的大小纠正差异
但它不引用下一条记录,因为内存中下一条记录的地址:0x14e0,而且我正在损坏堆。
任何建议:为什么?
【问题讨论】:
-
在
deleteInventory中,length变量在使用时未初始化。 -
您可能已经对关闭的第二个指针进行了指针运算。 ——仅建议。有专门的 malloc 库和 valgrind 等工具来查明您的问题。编辑:@mbratch 看起来有一个解决方案,除非长度是一个全局变量。 +1
-
@mbratch
length是全局变量 :) -
为什么不使用 std::vector
和 std::string 而不是 char 数组? -
你能构造一个minimal test-case吗?