0

我在这个项目中使用 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);
}

请提供有关我哪里出错的任何建议。我也浏览了这篇文章,我的代码似乎符合它。

谢谢!!

4

3 回答 3

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            
        ------
于 2013-10-04T15:09:31.673 回答
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。另外,我认为这更清楚一些。

于 2013-10-04T14:31:09.687 回答
1

每次成功调用 malloc() 都必须调用 free()。你正在做两个 malloc,所以你需要调用 free 两次。一次用于 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);
于 2013-10-04T14:38:26.277 回答