使用指针指针初始化C struct

时间:2017-07-12 22:42:23

标签: c pointers struct

我正致力于为作业创建哈希表实现。我将哈希表定义为结构如下:

raw_data

我必须在使用双指针的方法中初始化哈希表结构,例如:

typedef struct hashtable {
  int size;
  int entries;
  int table*;   // pointer to table. Each entry will point to linked list 
                // of key-value nodes 
} hashtable;

我已经在下面写了一个基本的实现:

void init(hashtable** ht) {
...
}

但是,我一直收到以下编译错误:

#include <stdio.h>
#include <stdlib.h>

typedef struct hashtable {
  int size;
  int entries;
  int table*;   // pointer to table. Each entry will point to linked list 
                // of key-value nodes 
} hashtable;

void init(hashtable**);

void init(hashtable** ht) {
    *ht = (hashtable *) malloc( sizeof(hashtable) );
    *ht->size = 3;
}

int main(){

  hashtable *t = NULL;
  init(&t);

  printf("t.size: %i", t->size);
}

所以我对以下内容感到困惑: 1.我不确定在向指针传递指针时如何在init函数中创建新结构。 2.分配结构后,如何修改结构成员属性?

5 个答案:

答案 0 :(得分:2)

您的代码中有2个错误:

  1. int table* - &gt; int *table - 声明指向整数的指针

  2. * ht-&gt; size - &gt; (*ht)->size - 当您不确定operator precedence

  3. 时,请设置括号

答案 1 :(得分:2)

这只是运营商优先问题。

编译器进程 - &gt;之前 *。因此,它尝试访问struct hashtable **的size成员,这是不可能的。

如果您使用(* ht) - &gt;尺寸交换* ht-&gt;尺寸,代码就会编译。

答案 2 :(得分:1)

问题在于

here

可以看出,

->的优先级高于C中的*

使用优先级规则*ht->size转换为*(ht-&gt; size)。这应该说明你得到错误的原因。另一种看待它的方法是

*(ht->size)=(*(*ht).size)

使用括号修复此问题,如下所示:(*ht)->size

hashtable的定义还有另一个问题:  int table*;将无法编译。请改用int *table;来声明pointer to int

答案 3 :(得分:1)

这是一个好的开始,其他人已经解决了代码中的主要问题。但是,我建议进行一些小调整:

#include <stdio.h>
#include <stdlib.h>

typedef struct hashtable {
  int size;
  int entries;
  int table*;   // pointer to table. Each entry will point to linked list 
                // of key-value nodes 
} hashtable;


// note: freeing the hashtable is a caller responsibility!
hashtable *new_hashtable() {
    hashtable *ht = malloc( sizeof(hashtable) );
    ht->size = 3; // since ht is only a single pointer, no need for (*ht)->foo 

    return ht;
}

int main(){

  hashtable *ht = new_hashtable();

  printf("ht.size: %i", ht->size);

  free(ht);
}

答案 4 :(得分:0)

感谢大家的快速回复。为了将来参考,这里使用解决方案快速更新原始代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct hashtable {
  int size;     // size of hash table
  int entries;  // number of slots allocated in table
  int *table;   /* pointer to table. Each entry will point to linked list
                  of key-value nodes */
} hashtable;

void init(hashtable**);

void init(hashtable** ht) {
    *ht = (hashtable *) malloc( sizeof(hashtable) );
    (*ht)->entries = 0;
    (*ht)->size = 3; //replace this with better init size, ideally a prime number
    (*ht)->table = malloc( (*ht)->size  * sizeof(int));
}

int main(){

  hashtable *t = NULL;
  init(&t);
  t->table[2] = 3;

  printf("t.size: %i \n", t->size);
  printf("t.arr:[2] %i \n", t->table[2]);
  free(t);
}