题目
现有三个字符串“lalalalala”,“yang”,“helloworld”,要求实现一个函数(接口)把这三个字符串存放到堆区。
要求:使用三级指针作为指针输出这个堆空间的地址。
代码
#include "stdio.h" #include "string.h" #include "stdlib.h" #include<string.h> int getArray(char ** myarray1, char ***newp, int num) { int i = 0; char **tmp = NULL; // 开辟堆空间存放一级指针,因为存放的是一级指针,所以用二级指针接收 tmp = (char **)malloc(num*sizeof(char *)); // 分别再给每个指针分配空间,用来存放字符串 for ( i = 0; i < num; i++) { tmp[i] = (char*)malloc(sizeof(char) * 100); } // 向空间中拷贝字符串 for (i = 0; i < num; i++) { strcpy(tmp[i], myarray1[i]); } // 把指针数组的空间地址返回回去 *newp = tmp; return 0; } void freeArray(char ***newpfree, int num) { char **p = NULL; int i = 0; int ret = 0; p = *newpfree; // 释放每一个存放字符串的空间 for (i = 0; i < num; i++) { free(p[i]); } // 释放存放一级指针的空间 free(p); // 把指针指向 NULL *newpfree = NULL; } int main() { int i = 0; int num = 3; // 总共有三个字符串 char **myArray3 = NULL; // 用于接收空间地址 char *myArray1[] = { "lalalalala", "yang","helloworld" }; getArray(myArray1, &myArray3, num); for (i = 0; i < num; i++) { printf("%s\n", myArray3[i]); } // 把空间都释放 freeArray(&myArray3, num); return 0; }
解析
通过题目解析我们可以看到,被调用函数 getArray 申请了堆空间并且通过三级指针 newp 把堆空间地址传出,我们称这个三级指针参数为输出参数。