例1:
#include<stdio.h>
#include<stdlib.h>
void fun(char*p)
{
char c = p[3];//或者是char c=*(p+3);
}
int main()
{
char*p2 = "abcdefg";
fun(p2);
system("pause");
return 0;
}
错误,因为无法把指针变量本身传递给一个函数
应该对实参做一份拷贝并传递给被调用函数,即对p2做一份拷贝,假设其拷贝名为_p2,那传递到函数内部的就是_p2,而并非p2本身。

例2:
void GetMemory(char*p,int num)
{
p = (char*)malloc(num*sizeof(char));
}
int main()
{
char*str=NULL;
GetMemory(str,10);
strcpy(str, "hello");
free(str);
return 0;
}


在运行strcpy(str, "hello")时发生错误,这时候str仍然是NULL,也就是说str本身并没有发生变化,malloc的内存地址并没有赋给str,而是赋给了_str,而_str是编译器自动分配和回收的,我们根本无法使用,所以不能这样获取内存。以下有两种办法:

法一:用return

#include<stdio.h>
#include<stdlib.h>
char*GetMemory(char*p,int num)
{
p = (char*)malloc(num*sizeof(char));
return p;
}
int main()
{
char*str=NULL;
str=GetMemory(str,10);
strcpy(str, "hello");
//free(str);
printf("%s\n", str);
system("pause");
return 0;
}


结果:

hello

请按任意键继续. . .

 

法二:用二级指针

#include<stdio.h>
#include<stdlib.h>
void GetMemory(char**p,int num)
{
*p = (char*)malloc(num*sizeof(char));
return p;
}
int main()
{
char*str=NULL;
GetMemory(&str,10);
strcpy(str, "hello");
//free(str);
printf("%s\n", str);
system("pause");
return 0;
}

注意,这里的参数是&str而非str,这样传递过去的是str的地址,是一个值,在函数内部,用钥匙("*")来开锁:*(&str),其值就是str。所以malloc分配的内存地址是真正赋值给了str本身