C语言值传递&&址传递
错误代码:
void GetMemory(char *p) { p = (char *)malloc(100); } void main(void) { char *str = NULL; GetMemory(str); strcpy(str, "hello world"); printf("%s", str); }
值传递:值传递是传给函数一份参数在栈上的临时拷贝,函数在这个临时拷贝上进行操作。函数调用结束后
该临时拷贝会被销毁,除非有返回值否则不会对实参造成影响。
址传递:址传递则是将变量的地址传递给形参,调用函数时通过这个形参找到实参直接对实参进行更改。
需要注意的是,如果实参是一个指针变量那么传址传的是指针的地址(&指针变量名,相当于一个二级指针)而非指针
的内容(虽然都是地址,但意义完全不同)。
所以本题的调用语句GetMemory(str);实质上是一次传值调用,而且函数返回值为空,这就意味无论在函数内部进行了
什么操作一旦调用结束返回str指针变量的值还是NULL并未发生任何改变。而且NULL指向的空间是被禁止访问的。
正确代码:
void GetMemory(char **p) { *p = (char *)malloc(100); } void main(void) { char *str = NULL; GetMemory(&str); strcpy(str, "hello world"); printf("%s", str); }