例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本身