初始化struct seg错误

时间:2014-08-25 06:46:36

标签: c segmentation-fault

我正在初始化一个表示哈希表的结构。我试图让频率= 0而密钥= null,但是我得到了一个seg错误并且不太清楚为什么。 这是我的代码:

htable htable_new(int capacity) {
  int i;

  htable result = emalloc(sizeof *result);
  result->capacity = capacity;
  result->frequencies = emalloc(capacity * sizeof result->frequencies[0]);
  result->keys = emalloc(capacity * sizeof result->keys[0]);
  for (i = 0; i < capacity; i++) {
    result->frequencies[i] = 0;
  }
  for (i = 0; i < capacity; i++) {
    result->keys[i] = NULL;
  }

  return result;
}

这是我初始化的结构:

struct htablerec {

  int capacity;
  int num_keys;
  int *frequencies;
  char **keys;

};

我没有看到错误,因为我试图将所有已分配给0的内容初始化, 以及所有指向NULL的char指针。这是错的吗?我应该以其他方式这样做吗? 谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

尝试以下方法(注意结果和返回类型附近的指针):

htable *htable_new(int capacity) {
  int i;

  htable *result = emalloc(sizeof *result);
  result->capacity = capacity;
  result->frequencies = emalloc(capacity * sizeof result->frequencies[0]);
  result->keys = emalloc(capacity * sizeof result->keys[0]);
  for (i = 0; i < capacity; i++) {
    result->frequencies[i] = 0;
  }
  for (i = 0; i < capacity; i++) {
    result->keys[i] = NULL;
  }

  return *result;
}

或者,就您的结构很小而言,您可能希望按值返回它:

htable htable_new(int capacity) {
  int i;
  htable result = { 0 };

  result.capacity = capacity;
  result.frequencies = emalloc(capacity * sizeof result->frequencies[0]);
  result.keys = emalloc(capacity * sizeof result->keys[0]);
  for (i = 0; i < capacity; i++) {
    result.frequencies[i] = 0;
  }
  for (i = 0; i < capacity; i++) {
    result.keys[i] = NULL;
  }

  return result;
}

我将result更改为实际的结构,而不是指向它的指针。因此,它在堆栈上分配,字段像往常一样初始化,然后我按原样返回。这意味着,所有结构都将被复制到新的位置。

请记住,只复制htable字段; capacitykeys被复制为指针。这意味着,如果您执行htable a = new_htable(10); htable b = a;,那么a.keys == b.keys(它们指向相同的数组)。

我不知道,你的代码是如何编译的。顺便说一下,您忘记初始化num_keys字段,并且您定义的结构名称与返回类型的名称不匹配。