逐渐重新分配内存会导致分段错误
Gradually reallocating of memory leads to segmentation fault
我正在尝试将新值附加到另一个函数中的 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;
}
您需要在 add
函数中区分 char*
、char**
和 char***
。也许一个好的方法是将参数命名为 pArray
以跟踪正在发生的事情:
int array_length = 0;
void add(char *** pArray, const char * new_val)
{
array_length++;
// we are modifying the original 'array' variable,
// so we need to assign the result to *pArray
// (also note the sizeof used here)
*pArray = realloc(*pArray, array_length * sizeof(char**));
// from now on, we don't need to mutate the original variable,
// so dereference 'pArray' into 'array'
char ** array = *pArray;
array[array_length - 1] = malloc(50 * sizeof(char));
strcpy_s(array[array_length - 1], 49, new_val);
}
如果你想避免三星级的东西,考虑将数组包装到一个结构中。这也更好,因为 array_length
不应该是全局变量。
例如:
typedef struct
{
char ** array;
size_t array_length;
}
string_list;
void add(string_list * s, const char * new_val)
{
s->array_length++;
s->array = realloc(s->array, s->array_length * sizeof(char**));
s->array[s->array_length - 1] = malloc(50 * sizeof(char));
strcpy_s(s->array[s->array_length - 1], 49, new_val);
}
void string_list_init(string_list * s)
{
s->array = NULL;
s->array_length = 0;
}
然后简单地:
string_list s;
string_list_init(&s);
// First way
add(&s, "first str"); // fine
add(&s, "second str"); // fine
add(&s, "third str"); // fine
add(&s, "fourth str"); // Segmentation fault (core dumped)
我正在尝试将新值附加到另一个函数中的 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;
}
您需要在 add
函数中区分 char*
、char**
和 char***
。也许一个好的方法是将参数命名为 pArray
以跟踪正在发生的事情:
int array_length = 0;
void add(char *** pArray, const char * new_val)
{
array_length++;
// we are modifying the original 'array' variable,
// so we need to assign the result to *pArray
// (also note the sizeof used here)
*pArray = realloc(*pArray, array_length * sizeof(char**));
// from now on, we don't need to mutate the original variable,
// so dereference 'pArray' into 'array'
char ** array = *pArray;
array[array_length - 1] = malloc(50 * sizeof(char));
strcpy_s(array[array_length - 1], 49, new_val);
}
如果你想避免三星级的东西,考虑将数组包装到一个结构中。这也更好,因为 array_length
不应该是全局变量。
例如:
typedef struct
{
char ** array;
size_t array_length;
}
string_list;
void add(string_list * s, const char * new_val)
{
s->array_length++;
s->array = realloc(s->array, s->array_length * sizeof(char**));
s->array[s->array_length - 1] = malloc(50 * sizeof(char));
strcpy_s(s->array[s->array_length - 1], 49, new_val);
}
void string_list_init(string_list * s)
{
s->array = NULL;
s->array_length = 0;
}
然后简单地:
string_list s;
string_list_init(&s);
// First way
add(&s, "first str"); // fine
add(&s, "second str"); // fine
add(&s, "third str"); // fine
add(&s, "fourth str"); // Segmentation fault (core dumped)