仅读取double pointer值时,使用triple pointer而非double pointer的考量是什么?
问题解答
C语言所有参数都是值传递,不管传什么类型的参数,都会在函数栈上创建一份临时副本,我们可以分两种场景分析你的疑问:
- 内存分配场景(对应
allocateData函数)
如果你把allocateData的入参改成char** dptrArrayData(仅用二级指针),确实会创建二级指针的临时副本。此时你在函数内部对形参dptrArrayData赋值malloc返回的地址,修改的只是栈上的临时副本,main函数中定义的原dptrArrayData指针不会受到任何影响,分配的内存地址无法传回调用方,最终会出现内存泄漏+野指针问题,程序必然运行异常。你现有代码用三级指针的本质就是传main中二级指针的地址,这样才能通过解引用直接修改原二级指针的内容,把分配的内存地址成功传回去。 - 打印场景(对应两个
print函数)
打印时不需要修改原二级指针的指向,所以不管传二级还是三级指针都可以正常运行:参数传递时创建的只是指针的临时副本,副本存储的地址和原指针完全一致,不会额外复制指针指向的数组、字符串内容,自然也不存在重新分配内存的问题。不过打印场景用三级指针属于完全没必要的冗余写法,更推荐用二级指针的版本。
另外你现有代码存在一处内存泄漏问题:你先给每个数组元素malloc了12字节内存,之后直接把元素赋值为字符串常量"Lorem Ipsum"的地址,直接丢失了malloc申请的内存地址,正确写法应该用strcpy((*dptrArrayData)[i], "Lorem Ipsum")把字符串内容拷贝到申请的内存中。
你提供的可运行代码
#include<stdio.h> #include<string.h> #include<stdlib.h> void allocateData(char ***dptrArrayData, int *intArraySize) { *dptrArrayData = (char**)malloc(*intArraySize*sizeof(char*)); for (int i = 0; i < *intArraySize; i++) { (*dptrArrayData)[i] = (char*)malloc(12*sizeof(char)); // 原写法会导致内存泄漏,建议替换为下面这行 // strcpy((*dptrArrayData)[i], "Lorem Ipsum"); (*dptrArrayData)[i] = "Lorem Ipsum"; } } void printDataDoublePointer(char **dptrArrayData, int intArraySize) { for (int i = 0; i < intArraySize; i++) { printf("Text:%s at index:%d\n",dptrArrayData[i],i); } } void printDataTriplePointer(char ***dptrArrayData, int *intArraySize) { for (int i = 0; i < *intArraySize; i++) { printf("Text:%s at index:%d\n",(*dptrArrayData)[i],i); } } int main() { char **dptrArrayData; int intArraySize = 5; allocateData(&dptrArrayData,&intArraySize); printDataDoublePointer(dptrArrayData,intArraySize); printDataTriplePointer(&dptrArrayData,&intArraySize); return 0; }
内容的提问来源于stack exchange,提问作者user13079152
相关产品推荐
相关产品推荐

