malloc错误程序
一:
GetMemory错误讲解(指针练习) 错误程序:
void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( “%s”,str );
}
1.调用GetMemory( str )后, str并未产生变化,依然是NULL.只是改变的str的一个拷贝的内存的变化(形参是实参的一份拷贝),相当于int a = 10,int b = a;b = 20;显然a≠20
2.strcpy( str, “hello world” );程序运行到这将产生错误:还是NULL
3.应在*p = (char *) malloc( 100 )后加 if ( *p == NULL )申请失败处理
4.申请的内存未释放
修改为二级指针传参:
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}
void Test(void)
{
char *str=NULL;
GetMemory=(&str);
strcpy(str,"hello world");
printf(str);
}
二:
char *GetMemory( void )
{
char p[] = "hello world";
return p;
}
void Test( void )
{
char *str = NULL;
str = GetMemory();
printf( str );
}
1.p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放,相当于访问未申请的空间
三:
void GetMemory( char **p, int num )
{
*p = (char *) malloc( num );
}
void Test( void )
{
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, "hello" );
printf( str );
}
1.应在*p = (char *) malloc( 100 )后加 if ( *p == NULL )申请失败处理
2.未释放内存空间
四:
void Test( void )
{
char *str = (char *) malloc( 100 );
strcpy( str, "hello" );
free( str );
printf( str );
}
1.在*p = (char *) malloc( 100 )后加 if ( *p == NULL )申请失败处理
2.free(str)后未置str为空,导致可能变成一个“野”指针,应加上: str = NULL
calloc
void*calloc(size_t num,size_t size);
函数功能为将num个大小为size的元素开辟一片空间,并将空间每个字节初始化为0;
realloc
voidrealloc(voidptr,size_t size);
该函数可以对动态开辟内存大小进行调整
ptr为先前开辟的内存(需要调整的空间)
size为调整后大小
返回值为调整之后的内存起始位置