C 释放动态分配的内存
我定义了一个函数,它返回多维数组 行的分配C 释放动态分配的内存,c,memory-management,malloc,free,C,Memory Management,Malloc,Free,我定义了一个函数,它返回多维数组 行的分配 arr = (char **)malloc(size); 列的分配(在循环中) 返回的类型是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
arr = (char **)malloc(size);
列的分配(在循环中)
返回的类型是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();
我调用函数的main的一部分
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;
inti;
对于(i=0;i
有些事情,你不应该强制执行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;
}
由于您没有显示完整的分配代码,因此很难知道您做错了什么。根据我们看到的情况,您应该有如下内容:
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);
}
}
如果你对此很马虎,不要抛出
malloc()
。如果你很小心,你可以在适合你的时候施放。不要施放malloc的结果。你能给出一个失败的完整例子吗?一般来说,对malloc
的每次调用之后都应该紧接着对free
的一次调用,因此您描述的代码应该可以工作。这个bug大概是在你还没有告诉我们的代码中。显示一个!很可能是因为您在代码中的某个地方编写了越界的代码,破坏了malloc存储的元数据。请编辑上面的问题,而不是在注释中编写太多代码。
for (size_t i = 0; i < n; i++)
free(arr[i]);
free(arr);
gcc -O3 -g -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wold-style-definition -Werror ...