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

为何直接赋值结构体指针地址有效,函数传参赋值却无效?

为什么直接将指针指向结构体地址可以正常工作,但通过函数传参赋值却无法运行?

在这段C语言代码中,直接给指针赋值结构体地址能正常输出,但调用GetData函数给指针赋值后,程序却无法正常运行:

#include <stdio.h>
#include <stdint.h>

typedef struct
{
    uint8_t data[5][1];
} TST_T;

TST_T s_Data;

void GetData(TST_T *pData)
{
    pData = &s_Data;
}

int main()
{
    s_Data.data[0][0] = 1;
    s_Data.data[1][0] = 2;
    s_Data.data[2][0] = 3;
    s_Data.data[3][0] = 4;
    s_Data.data[4][0] = 5;
    
    // TST_T *pData = &s_Data;       // 这样写可以正常运行
    
    TST_T *pData;
    GetData(pData);                 // 这样写无法正常运行
    
    for(uint8_t i=0; i<5; i++)
    {
        printf( "%d\n", pData->data[i][0] );
    }

    return 0;
}

问题原因

C语言的函数参数采用值传递机制:当你把pData指针传给GetData函数时,函数会创建一个该指针的副本。在函数内部修改pData = &s_Data,只是改变了这个副本的指向,完全不会影响main函数里的原指针。回到main后,pData还是未初始化的野指针,访问它的成员会导致未定义行为。

解决方案

要修改原指针的指向,需要传递指针的指针(双重指针)。通过把原指针的地址传入函数,函数可以解引用双重指针来直接修改原指针的指向:

#include <stdio.h>
#include <stdint.h>

typedef struct
{
    uint8_t data[5][1];
    
} TST_T;

static TST_T s_Data;

void GetData(TST_T **pData)
{
    (*pData) = &s_Data;
}

int main()
{
    s_Data.data[0][0] = 1;
    s_Data.data[1][0] = 2;
    s_Data.data[2][0] = 3;
    s_Data.data[3][0] = 4;
    s_Data.data[4][0] = 5;
    
    // TST_T *pData = &s_Data;       // 这样写可以正常运行
    
    TST_T *pData;
    GetData(&pData);                 // 现在可以正常运行了!
    
    for(uint8_t i=0; i<5; i++)
    {
        printf( "%d\n", pData->data[i][0] );
    }

    return 0;
}

这段代码中,GetData的参数是TST_T **pData(双重指针),调用时传入&pData(原指针的地址)。函数内部通过(*pData) = &s_Data解引用双重指针,直接修改了main里原指针的指向,因此回到main后pData能正确指向s_Data结构体。

内容的提问来源于stack exchange,提问作者user2654735

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 12:02:50