分配足够的内存后,为什么会出现“细分故障11”?

时间:2019-06-03 00:24:21

标签: c arrays string

我创建了双指针char用作2d数组来存储字符串。 append函数用于将提供的字符串添加到数组的末尾,提供num_strings指针以跟踪数组中的元素(因为我不能使用sizeof)。似乎在某个时候,该函数没有分配足够的内存,但我似乎无法弄清楚在哪里也找不到任何其他问题。

我已经尝试过为外部数组和内部数组提供大量内存,这远远超出了他们的需要。问题仍然存在。我还尝试过在函数运行后将字符串复制到数组中。

int main(int argc, char *argv[]) {
    char **strings = NULL;
    int num_strings = 0;

    append(&strings, &num_strings, "Alex");
    append(&strings, &num_strings, "Edward");

    // Do things with array

    for (int i = 0; i < num_strings; i++) {;
        printf("%s\n", strings[i]);
    }

    // Free memory after use

    for (int i = 0; i < num_strings; i++) {
        free(strings[i]);
    }

    free(strings);
    strings = NULL;

    return 0;
}

void append(char ***array, int * num_strings, char *string) {


    if (*array == NULL) {
        *array = malloc(sizeof(*array)); // start with enough room for 1 item (pointer)
    } else {
        // reallocate memory for new item
        *array = realloc(*array, (((*num_strings) + 1) * sizeof(*array)));

    }

    printf("Char Size: %lu\n", sizeof(char));
    printf("Given Size: %lu\n", sizeof(***(array)));

    *(array[*num_strings]) = malloc((strlen(string) + 1) * sizeof(***(array + 0)));

    strcpy(*(array[*num_strings]), string);

    (*num_strings)++; // increment the number of strings
}

程序的输出应该是两个字符串,此刻它只打印第一个,然后由于分段错误而崩溃。

1 个答案:

答案 0 :(得分:1)

问题在于*(array[*num_strings])有几个实例应该是(*array)[*num_strings]

区别在于,第一种形式试图通过传递给函数的指针进行索引,就好像传递的strings是一个数组一样,破坏了调用者的堆栈。校正后的版本首先取消引用指针,然后根据需要在目标中建立索引。

在一些使用sizeof(*array)的地方应该使用sizeof(**array)x = malloc(sizeof(x))永远都不正确。但这不会引起明显的问题。