[C] 错误笔记:函数调用——值传递
前提:
写一个函数,功能为在堆内开辟一块空间,并将首地址以函数参数的形式返回主调函数
错误demo
void test(char *a) { char str[10] = "hello"; printf("%s\n", str); a = (char *) malloc(strlen(str) + 1); memcpy(a, str, strlen(str)); a[strlen(str)] = '\0'; return; } int main() { char *test_p = NULL; test(test_p); printf("%s \n", test_p); free(test_p); return 0; }
结果:
分析错误:
在调用test函数的时候只是将test_p的值(NULL)传递给了test函数,也就相当与只是为test函数中的a(指针)做了个初始化,然后进行申请内存
在test内的局部变量a指向了开辟的内存的首地址,之后的任何操作都是对于这个局部变量的,跟主调函数中的test_p没有任何关系
这样test_p当然还是之前的初始值NULL
而且这个例子中test内的malloc并没有得到手动释放(free)
正确demo
void test(char **a) { char str[10] = "hello"; printf("%s\n", str); *a = (char *) malloc(strlen(str) + 1); memcpy(*a, str, strlen(str)); (*a)[strlen(str)] = '\0'; return; } int main() { char *test_p = NULL; test(&test_p); printf("%s \n", test_p); free(test_p); return 0; }
结果:
分析:
这次将test_p这个指针变量的地址传递给了test函数,此时的*a就是test_p了
继续申请内存,test_p来指向首地址,没有任何问题了
本节完......