题目
现有三个字符串“aaaaa”,“bbbbb”,“ccccc”,要求实现一个函数(接口)把这三个字符串拼接成一个字符串。
代码
#include "stdio.h" #include "string.h" #include "stdlib.h" void SortArray(const char ** const myArray1, char ** myarray2) { if (myArray1 == NULL) { printf("myArray1 err \n"); return; } // 给新生成的字符串预先分配空间 char *str = (char*)malloc(100); if (str==NULL) { printf("malloc err\n"); return; } // 把三个独立的字符串都拷贝到一起 strcpy(str, myArray1[0]); strcat(str, myArray1[1]); strcat(str, myArray1[2]); // 通过取*操作把新生成的字符串返回给 main 函数 *myarray2 = str; } int main() { char *myarray1 = NULL; const char *myArray[] = { "aaaaa", "bbbbb", "cccccc" }; SortArray(myArray, &myarray1); printf("%s", myarray1); free(myarray1); return 0; }
解析
1. 二级指针的输入输出
由题目解答我们可以看到调用者 main 函数中在栈区分配了内存通过二级指针 myArray1 输入给被调用者 SortArray 函数,这时我们称二级指针 myArray为输入参数。在被调用函数 SortArray 分配空间后并通过二级指针 myarray2输出给调用者 main 函数,这是我们称二级指针 myarray2 为输出参数。通过以上代码我们了解了二级指针的输入输出。
2. 内存模型图
由上图我们可以看到答案代码的内存模型图,首先在 main 函数中 myarray1 压栈这时他存放的是 NULL,然后 myArray 数组压栈他存放的是三个指针也就是三个地址,这三个地址对应的是三个字符串“aaaaa”,“bbbbb”,“ccccc”。
然后在SortArray 函数中参数 myArray1 压栈他存放的是数组 myArray 的地址 0xaa,接着 myarray2 压栈,他存放的地址是 myarray1 的地址 0xbb,最后 str 压栈他存放的是 malloc 出来的空间的地址 0x44,通过 *myarray2 = str(此时的myarray2地址是传进来的myarray1),使得 myarray1存放的地址为 0x44,这时 main 函数中的 myarray1 指针就指向了堆空间中的字符串 aaaaabbbbbccccc 了。