首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >结构指针算法给出了奇怪的结果

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

Stack Overflow用户
提问于 2013-12-10 19:27:03
回答 4查看 157关注 0票数 2

我有以下职能:

代码语言:javascript
复制
void deleteInventory( struct book** inventory )
{
    struct book* ptr = NULL;
    ptr = *inventory;

    while( length != 0)
    {
        free(ptr);
        length--;
        ++ptr;
    }
    free(inventory);
}

结构:

代码语言:javascript
复制
#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) (Struct)返回的大小:148个字节

我的库存变量是结构数组,包含3条记录。

现在,函数中的调试结果(没有高2个字节的地址):

代码语言:javascript
复制
inventory[0] = 0x1350
inventory[1] = 0x14e0
inventory[2] = 0x1670

内存差异: 400字节,好的

在第一次迭代时一切正常,第一次记录删除没有问题。

但之后

代码语言:javascript
复制
++ptr;

ptr将包含:0x13e4

库存- ptr =148个字节-根据结构大小校正差异

但是它没有引用下一条记录,因为内存中的下一条记录的地址是:0x14e0和我得到堆的损坏。

有什么建议吗:为什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-12-10 19:35:23

我认为您从inventory中删除的内容不正确。在free(ptr)之后,ptr之后的下一个内存块可能是垃圾内存。在这里,我认为删除清单的正确方法是:

代码语言:javascript
复制
void deleteInventory( struct book** inventory )
{
    book** i =  inventory;
    while( length != 0)
    {
        free(*i);
        length--;
        ++i;//notice the difference (++i) instead of (++(*i))
    }
    free(inventory);
}
票数 6
EN

Stack Overflow用户

发布于 2013-12-10 19:39:32

您已经说过inventory是一个数组,这很好。

您已经说过,book占用148个字节(当您计算填充时),这很好。

您没有说的是,您在inventory中放置的指针是一次性分配的,而您有一系列指针这一事实对我来说意味着它们不是。

不管您创建每个book,它似乎都是动态的。不能保证这些书是连续的,只有指向它们的指南针。

改变你的职能:

代码语言:javascript
复制
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);
}

这将读取连续指针到book数组以删除所有book,而不假定book本身是连续分配的。

票数 7
EN

Stack Overflow用户

发布于 2013-12-10 19:39:42

我们只能推测inventory及其内容是如何存活的,但是由于您单独地释放了它们,您可能也有单独的malloc()d。但是,您可以通过ptrptr++来检查它们,它们假设连续分配的结构成员,就像数组中的情况一样。

但是,没有什么保证(平均实现也不会这样做) malloc()将以任何方式返回连续分配的连续存储。

这就是为什么您看到它们比预期的148个字节更多的原因。由于清单可能是分配的指针的数组,所以您要做的是:

代码语言:javascript
复制
while( length != 0)
{
    free(*inventory);
    length--;
    ++inventory;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20503477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档