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 ...