- 改变变量用一级指针,改变指针用二级指针
1)改变值
void fun(int *p)
{
int b = 100;
p = &b; // 将p指向b,改变的是局部变量的值,实参不受影响
}
void fun2(int *p)
{
*p = 100; // 将p指向的变量赋值100,改变的是实参指针指向的值,实参会受到影响 //
} //改变变量用一级指针,改变指针用二级指针,
main()
{
int a = 10;
int *q;
q = &a;
printf("*q=%d\n", *q); // *q=10
printf("a=*d\n", a); // a=10
fun(q);
printf("*q%d\n", *q); // *q=10
printf("a=*d\n", a); // a=10
fun2(q);
printf("*q%d\n", *q); // *q=100
printf("a=*d\n", a); // a=100
return 0;
}
2)改变指针
void GetMem1(char *s)
// 想在函数中分配内存,再返回,徒劳无功
{
s = (char *)malloc(100);
// GetMem1被调用时相当于用实参初始化了s,s指向了实参,
// 之后再执行malloc则会将申请到的内存地址再赋值给s
// 显然对实参没有任何影响。
}
void GetMemory(char **p)
{
*p = (char *)malloc(100);
if (NULL == *p)
{
printf("malloc failed!");
}
}
void Test(void)
{
char *str = NULL;
GetMemory(&str);
strcpy(str, "hello world");
printf(str);
free(str);
}
- 改变值,传参是一级指针,改变指针传参是二级指针,其中形参char**p存放str指针的地址,*p存放str指向的NULL
- 问题2:
char *GetMemory(void)
{
char p[] = "hello world";
return p;
}
void Test(void)
{
char *str = NULL;
str = GetMemory();
printf(str);
}
分析:
p是一个局部变量,函数调用结束后会释放,所以返回地址不明确,输出结果不确定
问题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);
}
分析:
运行正确,但有内存泄露,没有判断malloc是否申请成功,没有释放指针str
问题四:
void Test(void)
{
char *str = (char *)malloc(100);
strcpy(str, "hello");
free(str);
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
分析:运行结果为乱码,没判断空间是否申请成功,释放指针后没有置空,使其成为了野指针