先来看下面这段小程序test.c:
方法3:给init函数添加char *类型的返回值,把副本的值赋值给p:
转载请注明来自: Alex Zhou的程序世界 ,本文链接: http://codingnow.cn/c-c/946.html
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void init(char *p)
{
p = (char *)malloc(100);
}
int main()
{
char *p = NULL;
init(p);
if(p)
{
strcpy(p, "hello");
printf("%s \n", p);
}
else
{
printf("%s", "p not init");
}
free(p);
return 0;
}
这段程序会输出什么呢?
编译:gcc test.c -o test
执行:./test
发现打印的是”p not init”,这是为什么呢?原因很简单:因为c/c++中是会为指针分配内存空间的,指针传递就跟普通的数据类型一样,会拷贝p的副本_p,_p和p的内容一样,都指向同一个对象,此时都为NULL,但是_p和p自身的内存地址不一样。调用init(char *p)只是让副本_p指向了一块分配的内存空间,p还是NULL。知道了原因就好处理,下面提供三种解决方案:
方法1. 把char *p = NULL改成char p[100] = {0},这样传过去的是字符数组的首地址。
方法2. 把init函数的参数改成char **p,调用的时候传指针自身的地址,init(&p):
void init(char **p)
{
*p = (char *)malloc(100);
}
方法3:给init函数添加char *类型的返回值,把副本的值赋值给p:
char* init(char *p)
{
p = (char *)malloc(100);
return p;
}
转载请注明来自: Alex Zhou的程序世界 ,本文链接: http://codingnow.cn/c-c/946.html