c - 初始化结构段错误

标签 c segmentation-fault

我正在初始化一个代表哈希表的结构。我试图使频率 = 0 且键 = null,但我遇到了段错误,但不太清楚原因。 这是我的代码:

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 的所有 int 初始化, 并且所有 char 指针都指向 NULL。这是错误的吗?我应该以其他方式做这件事吗? 感谢您的帮助!

最佳答案

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

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字段和您定义的结构名称与返回类型的名称不匹配。

关于c - 初始化结构段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25480362/

相关文章:

python - 将输入发送到直接输入(如游戏)

c - 在头文件中声明结构

c++ - 递归函数返回列表中的段错误

c++ - 使用 g++7 构建的代码因访问未对齐的内存而崩溃

c - 我怎么知道用户按下了哪个关键字?

c - main() 的多重定义

c - C中命令行的多个输入参数

C memcpy 交换二维数组的行

matlab - 检测到分段违规 - matlab

c++ - 文件读取期间的段错误