【发布时间】:2021-02-11 11:02:55
【问题描述】:
我有一个动态大小的字符串数组(编译时我不知道字符串的大小),这一直给我一个分段错误错误。该数组包含在一个名为hm 的结构中,它有一个字符串数组和一个值数组。这部分代码只是在将新字符串添加到结构时正确调整字符串数组的大小。
我对 C 和结构比较陌生,所以如果有更好的方法来实现它,我很想听听。我已经尝试过四处寻找这种情况,大多数人似乎都在使用sizeof(char) 而不是sizeof(char*) 遇到外部数组的问题,但是当我更改时,问题仍然存在。
//problematic part of the function
char** t = (char**)realloc(hm->keys, hm->size * sizeof(char*));
if (t) hm->keys = t;
for (i = 0; i < hm->size; i++) {
char* temp = (char*)realloc(hm->keys[i], hm->largestKey * sizeof(char)); //seg fault here
if (temp) {
hm->keys[i] = temp;
}
}
//struct
typedef struct HM_struct {
size_t size;
size_t largestKey;
char** keys;
int* values;
void (*add)(struct HM_struct* hm, char* key, int value);
} HM;
【问题讨论】:
-
您的代码在调用
realloc()之前确实调用了malloc()或calloc(),对吧? -
您不能在那里使用
realloc(),因为并非所有hm->keys[i]都已初始化。 -
您可以将
realloc()用于重新分配之前keys数组中的元素,但您必须将malloc()用于添加的新元素。 -
这意味着您需要在增长数组之前保存旧的大小。