c-为包含另一个结构数组的结构正确分配内存

c-为包含另一个结构数组的结构正确分配内存,c,memory,C,Memory,我想为包含另一个名为table的结构数组的结构分配内存。我检测到,当将指针分配给最后的函数时,linkedObjects数组中的变量被损坏,因此我认为我对动态内存的处理是错误的 我现在就是这样做的: typedef struct Object { void *key; struct Object *top; struct Object *next; } Object; typedef struct Table{ Object *linkedObjects;

我想为包含另一个名为
table
的结构数组的结构分配内存。我检测到,当将指针分配给最后的函数时,
linkedObjects
数组中的变量被损坏,因此我认为我对动态内存的处理是错误的

我现在就是这样做的:

typedef struct Object {
    void *key;
    struct Object *top;
    struct Object *next;
} Object;

typedef struct Table{
    Object *linkedObjects;
    size_t size, originalSize;
    HashFcn hfun;
    PrintFcn pfun;
    ComparisonFcn fcomp;
} Table;

TableP CreateTable(size_t tableSize, HashFcn hfun, PrintFcn pfun, ComparisonFcn fcomp)
{
    int i;
    struct Table *table = malloc(sizeof(table));
    if (table==NULL)
    {
        ReportError(MEM_OUT);
        return NULL;
    }
    table->linkedObjects = NULL;
    table->linkedObjects  = malloc(tableSize * sizeof(Object));

    for(i=0;i<tableSize;i++)
    {

        table->linkedObjects[i].next = malloc( MAX_IN_LIST*sizeof(Object) );
        table->linkedObjects[i].top = malloc( MAX_IN_LIST*sizeof(Object) );
        table->linkedObjects[i].key = NULL;
        table->linkedObjects[i].top->key = NULL;
        table->linkedObjects[i].next->key = NULL;

        if (table->linkedObjects[i].next == NULL)
        {
            ReportError(MEM_OUT);
            return NULL;
        }
    }

    table->size = tableSize;
    table->originalSize = tableSize;
    table->hfun = hfun;
    table->pfun = pfun;
    table->fcomp = fcomp;
    return table;
}
另一个编辑:确认它在最近的通话中随机发生(不仅仅是在上面的一行):

这似乎没有道理。当我看到带有集合的
next
top
时,我希望有一个指针指向一个
对象(指向集合中的下一项或集合中的第一项)

您是否打算执行以下操作:

for(i=0;i < (tableSize-1);i++)
{
    table->linkedObjects[i].top = table->linkedObjects[0];
    table->linkedObjects[i].next = table->linkedObjects[i+1];
    table->linkedObjects[i].key = NULL;
}
for(i=0;i<(表大小-1);i++)
{
table->linkedObjects[i]。top=table->linkedObjects[0];
table->linkedObjects[i]。next=table->linkedObjects[i+1];
table->linkedObjects[i]。key=NULL;
}

这将为每个
对象
分配内存,然后设置指针

结构表*Table=malloc(sizeof(Table))

应该是


struct Table*Table=malloc(sizeof(Table))

我有时喜欢C


`

像往常一样,摆脱在
sizeof
下使用类型名的习惯。这就是内存分配的外观

Table *table = malloc(sizeof *table);
...
table->linkedObjects = malloc(tableSize * sizeof *table->linkedObjects);

这也将修复第一次分配中的“输入错误”。

您是想给下一次和上一次分配大量内存吗?根据我的理解,这些对象应该只需要在其中存储一个结构,除非next和top本身就是数组。不,我不需要太多内存,正如你所说的——一个结构目前next和top是独立的数组,它们各自拥有一组对象,这是故意的吗?我想知道你在这里想做什么。我猜next和top应该是数组的一部分
next和top是指向结构的指针
top
next
是神秘的。他们是干什么的?为什么要为每个对象分配一个数组,并且只初始化第一个对象的一个字段?除此之外,我看不出这段代码有什么特别的错误。错误很可能在别处。除非列表中的MAX_是0,否则这是错误的。我已经在进行分配了,但它会为每个对象分配内存吗?哦,我没看到。您不需要为
top
next
分配内存,因为您已经在数组本身中分配了这些内存。您正在使用指针指向数组中的某些元素。如果要分配额外的内存并为每个指针使用新的
对象
s,它不会指向您期望的位置。您希望它指向数组中的那些,而不是新分配的。我希望所有内容都为null,但稍后它应该有足够的内存。请查看我的编辑确认。在这上面花了2个小时,如果没有其他人的帮助,我永远也不会看到这个,谢谢!首先,要么
struct Table*Table=malloc(sizeof(struct Table))
要么
Table*Table=malloc(sizeof(Table))
。下定决心,坚持到底。其次,我认为应该是
struct Table*Table=malloc(sizeof*Table)
。不用的时候不要使用类型名。有很多可能性,是的。我想说的是
typedef struct table\u t table
。我不会使用
malloc(sizeof*var)
,而是使用
((T*)malloc(sizeof(T)))
,包装在宏中,就像在GNU libiberty中一样。宏是邪恶的,但有些东西甚至更邪恶。但不管什么东西会融化你的黄油。在这里同意@AndreyT。能够使用
struct Table*Table=malloc(sizeof(Table))
必然会引起混淆,因为OP代码中
Table
typdef
。第二,我认为最正确的答案是
Table*Table=malloc(sizeof*Table)如@AndreyT在下面的回答中所述。如果
更改为新类型,则分配的大小仍然正确。我相信第一个赋值,
struct Table*Table=malloc(sizeof(Table))
正在分配指向表的指针的大小,但我很高兴这里的意见是正确的。@KyleWpppd:是的,它分配指针的大小。这就是这个答案所要解决的错误。
table->size = tableSize;
table->originalSize = tableSize;
table->hfun = hfun;
table->pfun = pfun;
table->fcomp = fcomp;
table->linkedObjects[i].next = malloc( MAX_IN_LIST*sizeof(Object) );
table->linkedObjects[i].top = malloc( MAX_IN_LIST*sizeof(Object) );
for(i=0;i < (tableSize-1);i++)
{
    table->linkedObjects[i].top = table->linkedObjects[0];
    table->linkedObjects[i].next = table->linkedObjects[i+1];
    table->linkedObjects[i].key = NULL;
}
Table *table = malloc(sizeof *table);
...
table->linkedObjects = malloc(tableSize * sizeof *table->linkedObjects);