?一、请问运行 Test 函数会有什么样的结果?
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
答案是:NULL
?传入函数 GetMemory( char *p )的形参为字符串指针,在函数内部修改形参并 不能真正的改变传入形参的值,执行完 char *str = NULL; GetMemory( str ); 后 的 str 仍然为 NULL;
?不要被字符串的外表给迷惑了,虽然传入的是地址但是我们如果要对字符串做其他操作的话也是传地址啊,那怎么解决的?
1.改变函数的返回值将分配内存的地址给返回
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *GetMemory(char *p)
{
p = (char *)malloc(100);
return p;
}
void Test(void)
{
char *str = NULL;
str= GetMemory(str);
strcpy(str, "hello world");
printf(str);
}
int main()
{
Test();
return 0;
}
2.传入二级指针
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void GetMemory(char **p)
{
*p = (char *)malloc(100);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf(str);
}
int main()
{
Test();
return 0;
}
?二、请问运行 Test 函数会有什么样的结果?
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
我们 可以来试一试:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
int main()
{
Test();
return 0;
}
?没有输出
?
?其实可能是乱码。 char p[] = "hello world";return p; p[]数组为函数内的局部自动变 量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在 于不理解变量的生存期。
三、请问运行 Test 函数会有什么样的结果?
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void Test(void)
{
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
能够输出 hello, Test 函数中也未对 malloc 的内存进行释放。 GetMemory 避免 了以上问题,传入 GetMemory 的参数为字符串指针的指针,但是在 GetMemory 中执行申请内存及赋值语句*p = (char *) malloc( num ); 后未判断内存是否申 请成功,应加上: if ( *p == NULL ) { ...//进行申请内存失败处理 }
四、请问运行 Test 函数会有什么样的结果?
void Test(void)
{
char *str = (char *) malloc(100);
strcpy(str, “hello”);
free(str);
if(str != NULL)
{
strcpy(str, “world”);
printf(str);
}
}
?运行成功!
?运行成功,输出可能是乱码, char *str = (char *) malloc(100); 后未进行内存是 否申请成功的判断;另外,在 free(str)后未置 str 为空,导致可能变成一个“野” 指针,应加上: str = NULL;
|