首先看看几个容易出错的问题:
(1)void GetMemory( char *p )
{
p = (char *) malloc( 100 );
}
void Test( void )
{
char *str = NULL;
GetMemory( str );
strcpy( str, "hello world" );
printf( str );
}
结果:程序崩溃。
因为 GetMemory 并不能传递动态内存, Test 函数中的 str 一直都是 NULL。
strcpy(str, "hello world");将使程序崩溃。
修正:GetMemory 函数为 char* GetMenory(char* p){return p=(char *) malloc(100);}
(2)char *GetMemory( void )
{
char p[] = "hello world";
return p;
}
void Test( void )
{
char *str = NULL;
str = GetMemory();
printf( str );
}
结果:可能是乱码。
因为 GetMemory 返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原现的内容在函数结束时已经被清除,新内容不可知。可以返回局部变量的值,但不能返回局部变量的地址。(尽量不要让返回值为局部变量)
修正:GetMemory 函数为 char* GetMenory(char* p){return p = "hello world";}
(3)void GetMemory( char **p, int num )
{
*p = (char *) malloc( num );
}
void Test( void )
{
char *str = NULL;
GetMemory( &str, 100 );
strcpy( str, "hello" );
printf( str );
}
结果:输出字符串"hello"。
(4)void Test( void )
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
结果:free(str) 之后,str 成为野指针, if(str != NULL)语句不起作用。详情看野指针的介绍。