我已经定义了函数,它返回多维数组。
行的分配
arr = (char **)malloc(size);
列的分配(循环中)
arr[i] = (char *)malloc(v);
并且返回类型是char **
一切正常,除了释放记忆。如果我在函数返回的数组上调用free(arr [i])和/或free(arr),它就会崩溃。
编辑:
分配功能
pole = malloc(zaznamov);
char ulica[52], t[52], datum[10];
float dan;
int i = 0, v;
*max = 0;
while (!is_eof(f))
{
get_record(t, ulica, &dan, datum, f);
v = strlen(ulica);
pole[i] = malloc(v);
strcpy(pole[i], ulica);
pole[i][v-1] = '\0';
if (v - 1 > *max)
{
*max = v;
}
i++;
}
return pole;
我调用函数的主要部分
pole = function();
释放记忆
int i;
for (i = 0; i < zaznamov; i++)
{
free(pole[i]);
pole[i] = NULL;
}
free(pole);
pole = NULL;
答案 0 :(得分:0)
很少有东西,你不应该施放malloc的结果。
char** alloc_2d_char(int rows, int cols) {
char *data = malloc(rows*cols*sizeof(char));
char **array= malloc(rows*sizeof(char*));
for (int i=0; i<rows; i++)
array[i] = &(data[cols*i]);
return array;
}
当然,您需要检查从malloc
返回的NULL免费:
void free_2d_pixel(char **data){
free(data[0]);
free(data);
}
答案 1 :(得分:0)
由于您没有显示完整的分配代码,因此很难知道您做错了什么。鉴于我们所看到的,你应该有类似的东西:
size_t n = 27;
size_t size = n * sizeof(char *);
char **arr = (char **)malloc(size);
size_t v = 39;
if (arr == 0)
...report error and bail out...
for (size_t i = 0; i < n; i++)
{
if ((arr[i] = (char *)malloc(v)) == 0)
{
// Out of memory — release what was already acquired
for (size_t j = 0; j < i; j++)
free(arr[i]);
free(arr);
}
}
然后释放数据:
for (size_t i = 0; i < n; i++)
free(arr[i]);
free(arr);
您必须以某种方式跟踪数组中元素的数量(我的代码中为n
)。弄错了就是问题。其他顺序的释放也是如此;在元素出错之前释放arr
。
至于铸造或不铸造,malloc()
的返回值,就我而言,取决于你。 C ++要求它。 C曾经在标准C之前的日子里要求它。只要你总是使用选项进行编译就必须在调用它之前声明malloc()
,它就没有坏处。 C99要求严格的一致性模式。让你的编译器要求它。我几乎总是使用严格的编译器选项来确保发生这种情况:
gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Werror ...
如果你对此很草率,请不要施放malloc()
。如果你小心的话,如果它适合你,你可以施放。