最近看到一个关于指针的比较有意思的例子,拿来与大家分享一下。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void GetMemory(char *p)
{
p = (char *)malloc(100);
}
void main(void)
{
char *str = NULL;
GetMemory(str);
strcpy(str, "hello world/n");
printf(str);
}
运行上面代码,出现异常。接着看下面例子
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * GetMemory(char *p)
{
p = (char *)malloc(100);
return p;
}
void main(void)
{
char *str = NULL;
char *str1 = NULL;
str1 = GetMemory(str);
strcpy(str1, "hello world/n");
printf(str1);
printf("str addr is 0x%p/n",str);
printf("str1 addr is 0x%p/n",str1);
}
运行上面的代码,输出结果为:
hello world
str addr is 0x00000000
str1 addr is 0x00383258
我们看到,str与str1所指向的地址并不相同。
我们再看下一个例子
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char * GetMemory(char **p)
{
*p = (char *)malloc(100);
return *p;
}
void main(void)
{
char *str = NULL;
char *str1 = NULL;
str1 = GetMemory(&str);
strcpy(str1, "hello world/n");
strcpy(str, "hello world/n");
printf(str1);
printf(str);
printf("str addr is 0x%p/n",str);
printf("str1 addr is 0x%p/n",str1);
}
运行上面的代码,输出结果为:
hello world
hello world
str addr is 0x00383258
str1 addr is 0x00383258
暂且不管内存泄露的情况,就他们的输出结果来看,可以得出以下结论:
1、GetMemory(char *p)函数改变不了str指针变量的值。str与p之间的传递仍旧只是值传递。
2、GetMemory(char **p)函数却能改变str指针的值。str与p之间的传递是将str的地址传给了p。即p与*str指向同一段地址。因此*p的改变当然就能改变str的值。
3、无论形参是指针也好不是指针也好,永远都遵守单向值传递的原则。