结构的指针算法给出了奇怪的结果

pyd*_*evd 2 c pointers

我有以下功能:

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而且我正在腐败堆.

有什么建议:为什么?

Sco*_*ica 7

你说这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本身是连续分配的.


Rax*_*van 6

我认为你正在删除错误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)