我想为包含另一个名为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;
}
编辑:我编辑了功能代码以反映答案:
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));
if (table->linkedObjects == NULL)
{
ReportError(MEM_OUT);
return NULL;
}
for(i=0;i<tableSize;i++)
{
table->linkedObjects[i].next = NULL;
table->linkedObjects[i].top = NULL;
table->linkedObjects[i].key = NULL;
}
table->size = tableSize;
table->originalSize = tableSize;
table->hfun = hfun;
table->pfun = pfun;
table->fcomp = fcomp;
//printf("%p\n", table->hfun);
return table;
}
但是当我到达结尾处的分配点时,table->linkedObjects[0].key
为空且值为0x0
时会超出值0x8048cc0
。执行此行时会发生这种情况:
table->originalSize = tableSize;
另一个编辑:确认它在最后一次调用中随机发生(不仅在上面的行中):
table->size = tableSize;
table->originalSize = tableSize;
table->hfun = hfun;
table->pfun = pfun;
table->fcomp = fcomp;
答案 0 :(得分:5)
struct Table *table = malloc(sizeof(table));
应该是
struct Table *table = malloc(sizeof(Table));
我有时喜欢C。
`
答案 1 :(得分:1)
像往常一样,摆脱在sizeof
下使用类型名称的习惯。这就是你的内存分配看起来的方式
Table *table = malloc(sizeof *table);
...
table->linkedObjects = malloc(tableSize * sizeof *table->linkedObjects);
这也可以解决第一次分配中的“拼写错误”错误。
答案 2 :(得分:0)
table->linkedObjects[i].next = malloc( MAX_IN_LIST*sizeof(Object) );
table->linkedObjects[i].top = malloc( MAX_IN_LIST*sizeof(Object) );
这似乎没有意义。当我看到带有集合的next
或top
时,我希望指向一个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;
}
这将为每个Object
分配内存,然后设置指针。