You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:54:03