作者:qyfdxlwb | 来源:互联网 | 2023-01-04 17:33
我的代码中发生了一个重大问题,我现在一直试图修复几个小时.
下面的代码是与我所遇到的问题相关的代码......
方法addBucket:
void addBucket(SPACE * hashmap,char * tempvalue, char * tempkey){
printf("BEGINNING OF FUNC...\n");
void *prevadd = hashmap[0];
char *value = varString(tempvalue);
char *key = varString(tempkey);
void *aftadd = hashmap[0];
printf("BUCKET %s - %s\n",value,key);
BUCKET *newBucket = malloc(sizeof(BUCKET *));
fillBucket(value,key,newBucket);
int hash = hashFunc(key);
printf("FILL, FULFILLED\n");
if(!hashmap[hash]){
hashmap[hash] = malloc(sizeof(BASE*));
hashmap[hash]->first = NULL;
}
ITEM *location;
location = hashmap[hash]->first;
//This creates a new item in the list, if there isn't any.
//It does this by initialising the base, called box.
if(!location){
hashmap[hash]->first = (ITEM *) calloc(1,sizeof(ITEM *));
hashmap[hash]->first->next = NULL;
hashmap[hash]->first->prev = NULL;
hashmap[hash]->first->data = newBucket;
}
//This instead adds a new item to the list.
else{
//This loop reaches the last ITEM in the linked list itself
while(location->next){
location = location->next;
}
//This initialises the newItem that will be added
ITEM *newItem = (ITEM *) calloc(1,sizeof(ITEM));
newItem->next = NULL;
newItem->data = newBucket;
newItem->prev = location;
location->next = newItem;
}
}
使用的声明结构:
//Declares a struct called BUCKET.
//Serves as the bucket of the hash table.
typedef struct bucket{
char * value; //The value inputted.
char * key; //The key to be hashed.
}BUCKET;
//Declares a struct called ITEM.
//Holds the bucket, as well as the address to the next bucket.
//It also holds the address to the previous bucket.
typedef struct item{
struct bucket * data;
struct item * next;
struct item * prev;
}ITEM;
//Declares a struct called BASE.
//Serves as the base node for the linked lists.
//The amount of initialised linked lists is the same as the amount of bases.
typedef struct base{
struct item * first;
}BASE;
//Declares a struct of an array of BASES, meaning linked lists.
//Essentially defines the size of the hashspace.
typedef BASE *SPACE;
...而方法expandHashspace(); :
//Makes the size of the entire hashspace larger.
//Only takes a value larger than the current size due to possible data loss.
SPACE* expandHashspace(SPACE *hashmap, int newSize){
if(newSize>100 || newSize
这里也是initHashmap()方法:
SPACE* hashmapInit(SPACE *hashmap){
hashmap = calloc(5, sizeof(SPACE *));
hashSpaceSize = 5;
return hashmap;
}
我在这里做的是初始化hashmap,添加三个桶,扩展hashmap,然后再添加三个桶.这是更简单的顺序:
initHashmap();
addBucket(...); x3
expandHashmap();
addBucket(...); x3
但是,在最后一部分,只要我运行一次addBucket,就会出现SIGSEGV错误.通过调试检查,我发现了一些关闭的东西.
你看到的变量*prevadd
和*aftadd
?我在调试时添加了它们,以查看hashmap [0]的地址发生了什么.这是我的结果图:
正如你在那里看到的那样,hashmap [0]的地址在这两char *
行中变化很大.具体来说,地址的变化发生char *value
在线上.
请放轻松我,因为我刚刚开始学习C 3个月前,我仍然非常不习惯内存分配.如果错误是显而易见的,请指出它,如果我分配内存或释放它的方式有问题,我很高兴听到它们(我的代码有一个非常重要的heisenbug,我无法解决对于我的生活,但这不是重点).
提前谢谢...抱歉所有最近的问题.
更新:忘了添加varString(); ...
char* varString(const char *origString){
size_t i;
for(i = 0;origString[(int)i]!='\0';i++){}
if(origString[i-1]=='\n') i-=2;
char *newString = malloc(i);
for(int j = 0; j <= i; j++){
newString[j] = origString[j];
}
newString[i+1] = '\0';
return newString;
}
lockcmpxchg8..
5
这不是一个答案,但它需要比评论中更多的格式:
请注意,您正在写作 "Value No. 1"
注意值aftadd
是0x756c6156
在内存中,假设一个小端机器,数字的布局aftadd
将是:
0x56 0x61 0x6c 0x75
在ASCII中,这些将是:
'V' 'a' 'l' 'u'
提示提示.
1> lockcmpxchg8..:
这不是一个答案,但它需要比评论中更多的格式:
请注意,您正在写作 "Value No. 1"
注意值aftadd
是0x756c6156
在内存中,假设一个小端机器,数字的布局aftadd
将是:
0x56 0x61 0x6c 0x75
在ASCII中,这些将是:
'V' 'a' 'l' 'u'
提示提示.