为何直接赋值结构体指针地址有效,函数传参赋值却无效?
为什么直接将指针指向结构体地址可以正常工作,但通过函数传参赋值却无法运行?
在这段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
相关产品推荐
相关产品推荐

