c - 当我分配了足够的内存时,为什么会得到 "segmentation fault 11"?

标签 c arrays string

我创建了双指针 char 用作二维数组来存储字符串。追加函数的目的是将提供的字符串添加到数组的末尾,提供 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
}

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

最佳答案

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

不同之处在于,第一种形式尝试通过传递给函数的指针进行索引,就好像传递的字符串是一个数组一样,从而破坏了调用者的堆栈。更正后的版本首先取消引用指针,然后根据需要通过目标进行索引。

还有一些地方在应该使用 sizeof(**array) 的地方使用了 sizeof(*array)x = malloc(sizeof(x)) 永远不正确。但这并没有造成明显的问题。

关于c - 当我分配了足够的内存时,为什么会得到 "segmentation fault 11"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56419945/

相关文章:

python - 将一组图像读入维度为 (num_img,channel, dim1, dim2) 的 4D Numpy 数组

arrays - 如何在unix中找到数组中的最后一个元素?

c++ - 从字符串中删除字符集

sql - 如何使用存储过程在sql server 2008中拆分字符串并将数据插入表

c - 为什么我们把 null 终止符放在大括号括起来的 char 数组初始化中

c - __builtin_clzll 在不同优化级别上的不同 gcc 输出并包装在一个函数中

c - 如何输入/读取非打印字符

c - io_submit writes() 是否保证按顺序执行?

java - 有没有一种方法可以用Java中的整数枚举来初始化数组

java - 如何将设置变量转换为字节/文件/输入流/字符串或从字节/文件/输入流/字符串转换?