【发布时间】:2020-11-04 20:04:45
【问题描述】:
我正在尝试将新值附加到另一个函数中的 c 字符串数组,但是我只能添加三个记录,当我尝试添加第四个条目等等时,会发生段错误的错误,这告诉我我使用了错误的记忆。据我了解,我逐渐按需将内存分配为 realloc(array, array_length * sizeof(char)) 所以它应该没问题,但事实并非如此。此外,当我尝试在 main() 函数中追加新记录时,它会按预期运行 10 条记录。
#include <stdio.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
int array_length = 0;
void add(char **array, char *new)
{
array_length++;
array = realloc(*array, array_length * sizeof(char*));
array[array_length-1] = malloc(50 * sizeof(char*));
strcpy(array[array_length-1], new);
}
int main()
{
char **array = malloc (sizeof (*array));
// First way
add(&array, "first str"); // fine
add(&array, "second str"); // fine
add(&array, "third str"); // fine
//add(&array, "fourth str"); // Segmentation fault (core dumped)
// Second way: 10 records successfully appended to array
// for (int i = 0; i < 10; i++)
// {
// array_length++;
// array = realloc(array, array_length * sizeof(char*));
// array[array_length-1] = malloc(50 * sizeof(char*));
// strcpy(array[array_length-1], "str");
// }
for (int i = 0; i < array_length; i++)
printf("%s\n", array[i]);
for (int j = 0; j < array_length; j++)
free(array[j]);
free(array);
return 0;
}
【问题讨论】:
-
嗯......我注意到的第一件事是类型不匹配。在
main()中,您将array定义为char**,然后将其地址(char***类型)传递给add(),但后面的函数接受char**类型的参数。 -
-
如果你启用了所有警告和错误,你的编译器可能会有already shown you where the problem is。首先,如果它应该表示一个字符串数组,那么主函数中的
array应该是char **类型。然后你传递一个指向这个变量的指针,以便realloc可以改变它,所以add必须接受char ***。其次,realloc的语法是x = realloc(x, new_length);,或者在本例中为*array = realloc(*array, ...)。 -
@Groo,感谢您的指出,但即使进行了这些更改,第 4 个元素仍会出现段错误
-
@user3121023,如果我将数组声明从 char **array = malloc (sizeof (*array)); 更改为有效to char ***array = malloc (sizeof (*array));我想它是通过 id 指向字符串的内存地址的指针?如果我调用 add 作为 add(array, "first str");不提供数组地址。最后释放内存会再次导致段错误
标签: c segmentation-fault realloc