我在这个项目中使用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帖子,我的代码似乎也符合它。
谢谢!
答案 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);