我是c语言的初学者。
我正在尝试使用以下代码创建一个简单的哈希表。但是,发生以下错误。任何人都可以向我解释为什么?
运行时错误:类型'struct Node *'存储到未对齐的地址0x0000ffffffff,需要8字节对齐 0x0000ffffffff:注意:指针指向此处 分割错误
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Hashnode
{
int size;
struct Node** hashnode;
}Hashtable;
typedef struct Node
{
char* word;
struct Node* next;
}Node;
int main(void)
{
Node* node = malloc(sizeof(Node));
node->word = "Elvin";
node->next = NULL;
printf("First Node created successfully!...\n");
Hashtable hasht;
hasht.size = 10;
for (int i = 0; i < hasht.size; i++)
{
hasht.hashnode[i] = NULL;
printf("the address of the %i hasnode is: %p\n", i, hasht.hashnode[i]);
}
printf("The hashtable is created successfully!...\n");
关注问题
更正上面的代码后,我想将hashnode与该节点链接。由于hashnode是Node **(指向node的指针的指针),因此hasnode的值应为node指针的地址(即&node)。我的代码在下面。
但是,这向我显示了一个错误,即从“节点**”(又称为“结构节点**”)分配给“结构节点*”的指针类型不兼容;删除&。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Hashnode
{
int size;
struct Node** hashnode;
}Hashtable;
typedef struct Node
{
char* word;
struct Node* next;
}Node;
int main(void)
{
Node* node = malloc(sizeof(Node));
node->word = "Elvin";
node->next = NULL;
printf("First Node created successfully!...\n");
Hashtable hasht;
hasht.size = 10;
hasht.hashnode = malloc(sizeof(*hasht.hashnode)*hasht.size);
for (int i = 0; i < hasht.size; i++)
{
hasht.hashnode[i] = NULL;
printf("the address of the %i hashnode is: %p\n", i, hasht.hashnode[i]);
}
printf("The hashtable is created successfully!...\n");
int key = 3;
hasht.hashnode[key] = &node;
}
知道我做错了什么吗?
答案 0 :(得分:2)
您忘记初始化指针表:
hasht.size = 10;
// you need to allocate the array of pointers
hasht.hashnode = malloc(sizeof(*hasht.hashnode)*hasht.size);
// now proceed with your loop
for (int i = 0; i < hasht.size; i++)
{
因此,在尝试初始化指针时,您在树林中写了一个未定义的位置:未定义的行为。