楼主这个问题在这个论坛有大牛写过专门的文章的,不知道链接了,我保存了一份。好东西大家分享,望作者见谅。。。
二、 关于动态申请内存的问题
这题出现率极高,60%不为过void GetMemory(char *p)
程序代码:
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
请问运行Test函数会有什么 样的结果?
答:试题传入GetMemory( char *p )函数的形参为 字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完
char *str = NULL;
GetMemory( str );
后的str仍然为NULL;
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
请问运行Test函数会有什么 样的结果?
答:可能是乱 码。
char p[] = "hello world";
return p;
的p[]数组为函数内的局部自动变量,在函数返回后,内存已 经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test函数会有什么 样的结果?
答:
(1)能够输出hello
(2 )Test函数中也未对malloc的内存进行释 放。
(3)GetMemory避免了试题1的问题,传入GetMemory的参数为字符 串指针的指针,但是在GetMemory中执行申请内存及赋值语句
*p = (char *) malloc( num );
后未判断内存是 否申请成功,应加上:
if ( *p == NULL )
{
...//进行申请内存 失败处理
}
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
请问运行Test函数会有什么 样的结果?
答:执行
char *str = (char *) malloc(100);
后未进行内存是否申请成功的判断;另外,在free(str)后未置str为空,导致可 能变成一个“野”指针,应加上:
str = NULL;