我正在初始化一个代表哈希表的结构。我试图使频率 = 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
字段被复制; capacity
和keys
被复制为指针。这意味着如果你这样做 htable a = new_htable(10); htable b = a;
然后a.keys == b.keys
(它们指向同一个数组)。
我根本不知道你的代码是如何编译的。顺便说一下,你忘记初始化num_keys
字段和您定义的结构名称与返回类型的名称不匹配。
关于c - 初始化结构段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25480362/