Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么此代码没有';不能在C中分配内存?_C_Memory_Hashtable_Allocation - Fatal编程技术网

为什么此代码没有';不能在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

更新的问题在这里

我正在用C语言制作一个哈希表。这就是我所做的。我想我正走在一条正确的道路上,但当我试图

main.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;
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,尤其是当你是初学者的时候。我认为这可能部分让你困惑。你最好避免以下事情:

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看起来更清晰