我正在初始化一个表示哈希表的结构。我试图让频率= 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指针。这是错的吗?我应该以其他方式这样做吗? 谢谢你的帮助!
答案 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
字段; capacity
和keys
被复制为指针。这意味着,如果您执行htable a = new_htable(10); htable b = a;
,那么a.keys == b.keys
(它们指向相同的数组)。
我不知道,你的代码是如何编译的。顺便说一下,您忘记初始化num_keys
字段,并且您定义的结构名称与返回类型的名称不匹配。