#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void test1(char **str)
{
char a[] = {"hello world!"};
*str = (char *)malloc(20);
strncpy(*str, a, 20);
}
char* test2()
{
char a[] = {"hello world!"};
char *str = NULL;
str = (char *)malloc(20);
strncpy(str, a, 20);
return str;
}
void test3(char * str)
{
char a[] = {"hello world!"};
str = (char *)malloc(20);
strncpy(str, a, 20);
}
int main(int argc, char *argv[])
{
char *test1_str = NULL;
char *test2_str = NULL;
char *test3_str = NULL;
test1(&test1_str);
printf("test1_str = %s\n",test1_str); //test1_str = hello world!
test2_str = test2();
printf("test2_str = %s\n",test2_str); //test2_str = hello world!
test3(test3_str);
printf("test3_str = %s\n",test3_str); //test3_str = (null)
free(test1_str);
free(test2_str);
free(test3_str);
return 0;
}
1、二级指针(正确)eg:test1使用的方法
将malloc得到的内存首地址通过二级指针返回到主函数
2、函数返回(正确)eg:test2使用的方法
将malloc得到的内存首地址通过函数返回值返回到主函数
3、一级指针(错误)eg:test3使用的方法
看上去没有问题,实际分析会有问题,用我们常用的例子进行分析即可看出
#include <stdio.h>
void test(char c)
{
c = 'B';
}
void main()
{
char ch = 'A' ;
test(ch);
printf("%c\n", ch);
}
输出的值为‘A’而不是‘B’,调用函数时,char c 被赋值进函数内部进行操作,不会影响到原值,
同样,传入一级指针,智能修改它指向的数据,不能修改它指向的地址