为什么此代码没有';不能在C中分配内存?
更新的问题在这里 我正在用C语言制作一个哈希表。这就是我所做的。我想我正走在一条正确的道路上,但当我试图 main.c为什么此代码没有';不能在C中分配内存?,c,memory,hashtable,allocation,C,Memory,Hashtable,Allocation,更新的问题在这里 我正在用C语言制作一个哈希表。这就是我所做的。我想我正走在一条正确的道路上,但当我试图 main.c HashTablePtr hash; hash = createHashTable(10); insert(hash, "hello"); insert(hash, "world"); HashTablePtr createHashTable(unsigned int capacity){ HashTablePtr hash; hash = (Has
HashTablePtr hash;
hash = createHashTable(10);
insert(hash, "hello");
insert(hash, "world");
HashTablePtr createHashTable(unsigned int capacity){
HashTablePtr hash;
hash = (HashTablePtr) malloc(sizeof(HashTablePtr));
hash->size = 0;
hash->capacity = capacity;
ListPtr mylist = (ListPtr)calloc(capacity, sizeof(ListPtr)); /* WHY IT DOESN'T ALLOCATE MEMORY FOR mylist HERE?? */
mylist->head = NULL;
mylist->size = 0;
mylist->tail = NULL;
hash->list = mylist;
return hash;
HashTable.c
HashTablePtr hash;
hash = createHashTable(10);
insert(hash, "hello");
insert(hash, "world");
HashTablePtr createHashTable(unsigned int capacity){
HashTablePtr hash;
hash = (HashTablePtr) malloc(sizeof(HashTablePtr));
hash->size = 0;
hash->capacity = capacity;
ListPtr mylist = (ListPtr)calloc(capacity, sizeof(ListPtr)); /* WHY IT DOESN'T ALLOCATE MEMORY FOR mylist HERE?? */
mylist->head = NULL;
mylist->size = 0;
mylist->tail = NULL;
hash->list = mylist;
return hash;
ListPtr是一个LinkedList ptr
List.h
typedef struct list List;
typedef struct list * ListPtr;
struct list {
int size;
NodePtr head;
NodePtr tail;
};
...
...
typedef struct hashtable * HashTablePtr;
typedef struct hashtable HashTable;
struct hashtable {
unsigned int capacity;
unsigned int size;
ListPtr *list;
unsigned int (*makeHash)(unsigned int, void *);
};
...
...
哈希表.h
typedef struct list List;
typedef struct list * ListPtr;
struct list {
int size;
NodePtr head;
NodePtr tail;
};
...
...
typedef struct hashtable * HashTablePtr;
typedef struct hashtable HashTable;
struct hashtable {
unsigned int capacity;
unsigned int size;
ListPtr *list;
unsigned int (*makeHash)(unsigned int, void *);
};
...
...
当我运行我的调试器时,我没有看到分配给myList的内存。在上面的示例中,我尝试将其设置为10个列表的数组
请帮我解决这个问题
如果有帮助的话,我不是C方面的专家。您正在分配一个连续的ListPtr块,但实际上您希望为所有结构分配空间,而不仅仅是指向这些结构的指针(ListPtr):
calloc(capacity, sizeof(List));
我同意gman关于不隐藏指针的评论。在用C编写代码时,我从不将
List*
定义为ListPtr
。这使代码更难理解。您正在分配一个连续的ListPtr块,但实际上您希望为所有结构分配空间,而不仅仅是指向这些结构的指针(ListPtr):
calloc(capacity, sizeof(List));
calloc(capacity, sizeof(ListPtr)
我同意gman关于不隐藏指针的评论。在用C编写代码时,我从不将List*
定义为ListPtr
。这使得代码更难理解
calloc(capacity, sizeof(ListPtr)
应该是
calloc(capacity, sizeof(List)
应该是
calloc(capacity, sizeof(List)
我认为这里有很多问题。您没有包括您得到的错误,因此,我将列出几个:
- hash=(HashTablePtr)malloc(sizeof(HashTablePtr*));-如果要分配哈希表**的大小,即四个字节,则需要分配基础对象的大小
- ListPtr mylist=(ListPtr*)calloc(容量、大小(ListPtr));-同样,您正在分配指针的大小,而不是底层列表对象的大小
- HashTablePtr createHashTable(unsigned int capacity)){-您可能会在这里得到一个编译错误,其中包含额外的参数和数量不一致的参数
- hash=(HashTablePtr)malloc(sizeof(HashTablePtr*));-如果要分配哈希表**的大小,即四个字节,则需要分配基础对象的大小
- ListPtr mylist=(ListPtr*)calloc(capacity,sizeof(ListPtr));-同样,您正在分配指针的大小,而不是底层列表对象的大小
- HashTablePtr createHashTable(unsigned int capacity)){-您可能会在这里得到一个编译错误,其中包含额外的参数和数量不一致的参数
typedef struct hashtable * HashTablePtr;
使用许多typedef将使代码更难阅读,因为您也需要不断地查找它们所引用的内容
主要的问题是,您分配的内存是哈希表/列表指针的大小,而不是它们所尊重的结构的大小。我认为下面的代码很好地说明了这一点。您还需要检查分配是否有效。如果malloc、calloc、realloc等失败,它们将返回NULL。如果发生这种情况,并且您不检查如果出现segfault错误,程序将崩溃
还要遵循c99标准,将所有变量声明放在函数的开头
在释放哈希表之前,请记住释放列表:
free(myhash->list);
free(myhash);
就我个人而言,我不太喜欢使用typedef,尤其是当你是初学者的时候。我认为这可能部分让你困惑。你最好避免以下事情:
typedef struct hashtable * HashTablePtr;
使用许多typedef将使代码更难阅读,因为您也需要不断地查找它们所引用的内容
主要的问题是,您分配的内存是哈希表/列表指针的大小,而不是它们所尊重的结构的大小。我认为下面的代码很好地说明了这一点。您还需要检查分配是否有效。如果malloc、calloc、realloc等失败,它们将返回NULL。如果发生这种情况,并且您不检查如果出现segfault错误,程序将崩溃
还要遵循c99标准,将所有变量声明放在函数的开头
在释放哈希表之前,请记住释放列表:
free(myhash->list);
free(myhash);
您粘贴的代码有许多不一致之处—createHashTable中有一个额外的参数,createHashTable调用中的参数比实际需要的多。这是您正在运行的同一代码吗?复制和粘贴比重新键入更好,因为您可能会引入(或修复)过程中出现错误…我认为如果不隐藏指针,您的许多问题都会变得明显。也就是说,去掉ListPtr和NodePtr what not.oops!我只是想让它看起来更干净,然后把它搞砸了。很抱歉。您不需要从calloc()中强制转换指针在纯C中,强制转换是隐式完成的,这使您的代码更清晰,隐藏的错误更少。您粘贴的代码在createHashTable中有许多不一致之处(额外的),对createHashTable的调用中的参数比实际需要的要多。这是您正在运行的同一代码吗?复制和粘贴比重新键入更好,正如您可能介绍的那样ce(或修复)过程中的错误…我认为如果你不隐藏指针,你的很多问题都会变得明显。也就是说,去掉ListPtr和NodePtr。糟糕!我只是想让它看起来更干净,然后把它搞砸了。很抱歉。你不需要从calloc()中强制转换指针在纯C中,强制转换是隐式完成的,这会使代码更清晰,隐藏的错误更少。对不起,我想让in看起来更清晰,所以搞砸了。我没有收到任何编译错误。对不起,我想让in看起来更清晰