【发布时间】:2014-02-19 07:28:21
【问题描述】:
我在运行此程序时在 free() 期间面临堆崩溃,但如果我使用 F10(在 Visual Studio 2010 中)进行调试,我会成功。
我的一段代码:
以下代码用于释放。在这种情况下,有人可以解释二维数组的释放吗?
void Deallocate2D ( SINT32 **pAccess, UINT8 i_ubyNoOfRows )
{
int i;
UINT8 *elem;
if ( NULL == pAccess )
{
printf ( "%d>Invalid Params\n", __LINE__ );
return;
}
printf ( "\nDeallocate 2D Array..................\n" );
/* Include the code to deallocate the 2D array */
{
free(pAccess);
}
}
以下代码用于内存分配:
SINT32 Allocate2D (
SINT32 ***pAccess,
UINT8 i_ubyNoOfRows,
UINT8 i_ubyNoOfCols )
{
SINT32 nResult = -1;
SINT32 **pAc = NULL;
UINT8 *pubyPositioner;
UINT32 unTotalSize;
int i;
//unTotalSize = i_ubyNoOfRows * i_ubyNoOfCols;
printf ( "\nAllocate 2D Array..................\n" );
/* Include the code to allocate the 2D array */
{
/*Contiguous memallocation pAc*/
pAc = (SINT32**)malloc(sizeof(SINT32*) * i_ubyNoOfRows);
if(pAc)
pubyPositioner = (UINT8*)malloc(sizeof(UINT8) * i_ubyNoOfCols);
if(pubyPositioner)
for(i = 0; i < i_ubyNoOfCols; ++i)
pAc[i] = (SINT32*)pubyPositioner + (i * i_ubyNoOfCols);
*pAccess = pAc;
/*Non contugious allocation*/
/*
pAc = (SINT32**)malloc(sizeof(SINT32*) * i_ubyNoOfRows );
*pAccess = pAc;
if(pAc)
for(i= 0; i < i_ubyNoOfRows; ++i){
pAc[i] = (SINT32*)malloc(sizeof(SINT32*) + (i * i_ubyNoOfRows) );
if(pAc[i])
for(j = 0; j < i_ubyNoOfCols; ++j)
pAc[i][j] = (UINT8)malloc(sizeof(UINT8) + (i_ubyNoOfRows * i_ubyNoOfCols) );
}
*/
if(*pAccess != NULL)
nResult = 0;
}
if ( NULL == pAccess )
{
printf ( "%d>Invalid Params\n", __LINE__ );
return -1;
}
return nResult;
}
填充数组和打印数组的代码:
SINT32 Fill2D (
SINT32 **pnAccess,
SINT32 *pnData,
UINT8 i_ubyNoOfRows,
UINT8 i_ubyNoOfCols )
{
SINT16 wRIndex, wCIndex, wDataIndex = 0;
printf ( "\nFill 2D Array..................\n" );
/* Include the code to fill the 2D array with the 1D values */
{
for(wRIndex = 0 ; wRIndex < 3; ++wRIndex)
for(wCIndex = 0; wCIndex < 3; ++wCIndex)
pnAccess [wRIndex][wCIndex] = pnData[wDataIndex++];
}
if ( ( NULL == pnAccess ) \
|| ( NULL == pnData ) )
{
printf ( "%d>Invalid Params\n", __LINE__ );
return -1;
}
return 0;
}
SINT32 Print2D (
SINT32 **pnAccess,
UINT8 i_ubyNoOfRows,
UINT8 i_ubyNoOfCols )
{
SINT16 wRIndex, wCIndex;
if ( NULL == pnAccess )
{
printf ( "%d>Invalid Params\n", __LINE__ );
return -1;
}
printf ( "\n2D Array..................\n\n" );
/* Include the code to Print the 2D array in matrix format */
{
for(wRIndex = 0 ; wRIndex < i_ubyNoOfRows; ++wRIndex)
{
if(wRIndex % 2 == 0)
printf("\n");
for(wCIndex = 0; wCIndex < i_ubyNoOfCols; ++wCIndex)
printf("%d ", pnAccess[wRIndex][wCIndex]);
}
}
return 0;
}
下面的代码是一种入口点:
void Test2DArray ( void )
{
SINT32 **pnData = NULL;
SINT32 nData1[] = { 10, 15, 20, 15, 20, 25, 10, 25, 20 };
SINT32 nData2[] = { 70, 75, 80, 65, 90, 25, 30, 35, 80 };
printf ( "\n==================================\n" );
printf ( "Test 2D Array..................\n" );
printf ( "==================================\n\n" );
if ( Allocate2D( &pnData, 3, 3 ) != -1 )
{
if ( Fill2D( pnData, nData1, 3, 3 ) != - 1 )
{
if ( NULL != pnData )
{
Print2D ( pnData, 3, 3 );
Deallocate2D ( pnData, 3 );
}
}
}
if ( Allocate2D( &pnData, 3, 3 ) != -1 )
{
if ( Fill2D( pnData, nData2, 3, 3 ) != - 1 )
{
if ( NULL != pnData )
{
Print2D ( pnData, 3, 3 );
Deallocate2D ( pnData, 3 );
}
}
}
}
【问题讨论】:
-
请不要投射
malloc返回的指针,经验法则很简单:每个malloc调用都必须与free调用配对。无法一次性释放 2D 数组,但您必须分别释放每个指针:char **foo; for (int i=0;i<foo_len;++i) free(foo[i]); free(foo); -
@EliasVanOotegem 您假设他正在使用兼容的 C 编译器来编译 C 代码。
-
@lundin:没有视觉 C 或 C++ 标签。如果 OP 使用的是 VC++ 编译器,他应该提到
-
我正在使用 MS Visual Studio,在其中创建 .c 文件来测试代码。感谢您的回复。请看,如果我不使用强制转换,编译器会在编辑器中显示错误消息。 @Lundin 我对连续分配和指针查找表有疑问。我将对此进行更多研究
标签: c multidimensional-array dynamic-memory-allocation