c - 当我分配了足够的内存时,为什么会出现“分段错误 11”?
问题描述
我创建了双指针 char 用作二维数组来存储字符串。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
}
程序的输出应该是两个字符串,目前它只打印第一个,然后由于分段错误而崩溃。
解决方案
*(array[*num_strings])
问题是应该有几个例子(*array)[*num_strings]
。
不同之处在于,第一种形式试图通过传递给函数的指针来索引,就好像传递strings
的是一个数组,破坏了调用者的堆栈。更正后的版本首先取消引用指针,然后根据需要通过目标进行索引。
也有一些地方该sizeof(*array)
用的地方sizeof(**array)
。x = malloc(sizeof(x))
永远不正确。但这不会导致明显的问题。
推荐阅读
- python - 在 pandas DataFrame 中保留 None (尽管有 astype() 和 to_parquet())
- coq - 为什么“欧米茄”策略不能解决这样一个简单的问题
- visual-studio-code - Visual Studio Code 无法识别名为“模板”的目录中的文件类型
- html - CSS 选择孙元素而不添加新的 HTML、ID 或 !important
- flutter - 解析JSON数据flutter的内容
- excel - VBA For Each 粘贴在 For Each 的第一个循环中返回公式,然后返回值
- flutter - 在网格视图和顶栏之间添加空间
- node.js - Discord.js 命令处理对我不起作用
- c - 在 C 中使用 GMP 库测试素数
- swift - MessageKit 中的自定义单元格