【问题标题】:Segmentation fault in dynamic string array动态字符串数组中的分段错误
【发布时间】: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-&gt;keys[i] 都已初始化。
  • 您可以将realloc() 用于重新分配之前keys 数组中的元素,但您必须将malloc() 用于添加的新元素。
  • 这意味着您需要在增长数组之前保存旧的大小。

标签: arrays c string dynamic


【解决方案1】:

问题是当您realloc() 并增加分配的内存大小时,新内存没有初始化(或使用调试库,初始化为一个标记值)。所以,假设你知道oldSize,一个快速的解决方法是:

char** t = realloc(hm->keys, hm->size * sizeof(char*)); // As before
if (t) hm->keys = t; // As before
for (i = oldSize; i < hm->size; i++)
    hm->keys[i] = NULL;

现在,根据realloc() definition,当你打电话时:

char* temp = realloc(NULL, hm->largestKey * sizeof(char));

它的行为如下:

char* temp = malloc(hm->largestKey * sizeof(char));

【讨论】:

    猜你喜欢
    • 2021-08-11
    • 2021-07-12
    • 1970-01-01
    • 2015-02-16
    • 1970-01-01
    • 2017-04-09
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多