如何解决Realloc用于结构
过去2天,我无法完成此代码。我正在尝试实现一个哈希表。它仅包含一个结构指针变量SIGCONT
,该变量存储一个结构对象。我已声明start
的26个对象组成的数组来存储结构。通过标识Hashtable
的起始字母(结构成员)来存储结构。
如果val
,则将其存储在val="ascii"
中。如果为ht[0]
,则它将存储在val="struct"
中。
我要插入5个值。如果值已经存在于哈希表中,则它将从哈希表中打印该值。否则,它将插入该值。我的程序无需重新分配即可正常运行。重新分配发生时,哈希表中的值不会显示。请参见代码下方的输出。
ht[18]
具有重新分配的输出:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct List {
char val[20];
};
struct Hashtable {
struct List *start;
};
struct Hashtable ht[26];
void init();
void insert(struct List *);
void init() {
register int j;
for (j = 0; j < 26; j++) {
ht[j].start=NULL;
}
}
int main(void) {
init();
int i = 0;
int size = 5; //size = 2 reallocation occurs
struct List *newnode = (struct List*)malloc(size * sizeof(struct List));
for (i = 0; i < 5; i++) {
if (size <= i) {
size = size * size;
struct List *temp = (struct List *)realloc(newnode,size * sizeof(*temp));
if (temp == NULL) {
printf("Realloc failed\n");
} else {
printf("realoocated\n");
newnode = temp;
}
}
scanf("%s",newnode[i].val);
insert(&newnode[i]);
}
printf("Printing\n");
for (i = 0; i < 5; i++) {
printf("%s\n",newnode[i].val);
}
free(newnode);
return 0;
}
void insert(struct List *node) {
if (ht[node->val[0] - 97].start == NULL) {
ht[node->val[0] - 97].start = node;
return;
} else {
printf("The value is %s\n",ht[node->val[0] - 97].start->val);
}
}
没有重新分配的输出
struct
sample
The value is struct
realoocated
string
The value is
ascii
realoocated
alpha
The value is ascii
Printing
struct
sample
string
ascii
alpha
解决方法
您遇到的基本问题是,当您调用realloc
时,内存块(可能)“移至”新地址。指向旧块的任何指针都不会进行神奇的更新,它们只会变得无效。因此,在您的情况下,您将指向struct List
的指针存储在哈希表中,然后调用realloc
,这会使所有先前存储的指针无效。以后再查看这些指针时,会得到未定义的行为。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。