在C中使用带2D阵列的自由错误

时间:2013-10-04 14:18:04

标签: c arrays malloc free

我在这个项目中使用C来创建一堆动态创建的数组。 它们是按照[here][1]生成的。这很好用。 “ 但是,当我尝试下面的代码释放数组时,我得到一个“分段错误(Core Duped)”。 我使用下面的列表来创建“my_struct”。

typedef struct
{
    uint32_t**  block;         
    uint32_t**  valid;
    uint8_t     block_size;     //Bytes per block

    uint8_t     level;
}my_struct;

my_struct L1, L2;

此后,稍后,指针“block”和“valid”将使用下面的函数分配动态内存,它们将作为参数连续传递(arr_ptr):

void Generate2DArray (uint32_t** arr_ptr, uint32_t row, uint32_t column)
{
uint32_t* temp;
uint32_t i = 0;
uint32_t j = 0;

arr_ptr = (uint32_t**)malloc(row* sizeof(uint32_t*));
if(arr_ptr == NULL)
{
    printf("MALLOC 1 FAILS \n ");
}
temp = (uint32_t*)malloc(row* column* sizeof(uint32_t));
if(temp == NULL)
{
    printf("MALLOC 2 FAILS \n ");
}
for (i = 0; i < row; i++)
{
  arr_ptr[i] = temp + (i * column);
}
}

到目前为止,这一切都很好。

现在,当我尝试“释放”代码末尾附近的内存时,使用下面的列表,我收到一条错误消息“分段错误(核心转储)”

void FreeMemory(uint32_t** arr_ptr, uint32_t rows)
{
    uint32_t i = 0;

    for ( i = 0; i < rows; i++)
    {
        free(arr_ptr[i]);
    }   
    free(arr_ptr);
}

请提供任何关于我哪里出错的建议。 我也经历了this帖子,我的代码似乎也符合它。

谢谢!

3 个答案:

答案 0 :(得分:2)

希望这会有所帮助。:)

       arr_ptr: row*sizeof(uint32_t*)
          ||
          ||
        __\/__       0   1   2   ...   column-1   column
  0    | temp ==>  |   |   |   |     |          |       |: column*sizeof(uint32_t)
  1    | temp             
  2    | temp                
  .    |  ..                 
  .    |  ..                 
row-1  | temp                
 row   | temp            
        ------

答案 1 :(得分:1)

修复你Generate2DArray,你没有实现你的想法。

void Generate2DArray  (uint32_t*** arr_ptr, uint32_t row, uint32_t column)
{
    int **array= malloc (row * sizeof (uint32_t*));

    for (int i = 0; i < row; i++)
        array[i] = malloc(column * sizeof(uint32_t));

    *arr_ptr = array;

}

使用:

使用它
int **arr_ptr;
Generate2DArray(&arr_ptr, rows, cols);

您可以使用单行分配行缓冲区的方式,但主要点是***,即最终arr_ptr的地址。此外,我认为这有点清楚。

答案 2 :(得分:1)

每次成功调用malloc()都必须调用free()。你正在做两个mallocs,所以你需要免费拨打两次电话。一次为arr_ptr,一次为temp(相当于arr_ptr [0])。

如果要保留FreeMemory的实现,则必须更改Generate2DArray,以便为每一行调用malloc并将返回的指针存储在arr_ptr [i]中。您应该决定是否认为最好有一个更大的内存块或更多更小的内存块,然后选择相应的实现。

另外:正如WhozCraig所说,你没有将分配的缓冲区返回给Generate2DArray的调用者。您应该将函数签名更改为以下其中一个:

// Return pointer
uint32_t** Generate2DArray (uint32_t row, uint32_t column);
// Pass pointer to the pointer variable and store it there
void Generate2DArray (uint32_t*** arr_ptr, uint32_t row, uint32_t column);