在C中返回带字符串值的结构

在C中返回带字符串值的结构,c,esp32,C,Esp32,我正在编写一个函数,它将返回一个包含两个字符串变量的结构,即SSID和password。这些函数的目的是基于mac地址数据生成SSID,mac地址数据从硬件api调用,硬件api更新指向变量的指针 函数创建并返回自定义类型。当我用引号手动设置其中一个字符串变量时,调用函数会很好地接收数据。但是,当我将变量设置为另一个变量的值时,它不会。这里少了什么 typedef结构{ char*ssid; 字符*密码; }无线认证; typedef wifi_auth_t*wifi_auth; void ge

我正在编写一个函数,它将返回一个包含两个字符串变量的结构,即SSID和password。这些函数的目的是基于mac地址数据生成SSID,mac地址数据从硬件api调用,硬件api更新指向变量的指针

函数创建并返回自定义类型。当我用引号手动设置其中一个字符串变量时,调用函数会很好地接收数据。但是,当我将变量设置为另一个变量的值时,它不会。这里少了什么

typedef结构{
char*ssid;
字符*密码;
}无线认证;
typedef wifi_auth_t*wifi_auth;
void getmac(uint8_t*mac){
mac[0]=0xFF;
mac[1]=0xFF;
mac[2]=0xFF;
mac[3]=0xFF;
mac[4]=0xFF;
mac[5]=0xEE;
}
wifi认证*wifi设置ap详细信息(){
uint8_t mac[6];
wifi_auth_t*wifi;
wifi=(wifi认证*)malloc(sizeof(wifi认证));
getmac(mac);
对于(int i=0;i<6;i++){
printf(“0x%.2X”,mac[i]);
}
printf(“\n”);
char-ssid[20];
sprintf(ssid,“WifiDevice_uux%X%X”,mac[3],mac[4],mac[5]);
wifi->ssid=ssid;
printf(“%s\n”,wifi->ssid);
wifi->password=“stackoverflow”;
返回wifi;
免费(wifi);
}
int main(){
wifi_auth_t*wifi=wifi_set_ap_details();
printf(“Wifi:%s\n”,Wifi->ssid);
printf(“通行证:%s\n”,无线->密码);
}

我想您不熟悉C语言,因为C语言必须显式管理内存

首先,
uint8_t mac[6]
字符ssid[20]在函数退出后不存在,因此在分配的wifi结构中指向它们的指针将指向可能是随机的内容。如果您知道大小始终相同,则处理此问题的一种方法是在结构中指定实际存储状态,如中所示:

typedef struct {
    uint8_t mac[6];
    char ssid[20];
} wifi_auth_t;
其次,当您分配
wifi
时,在最后一次使用它之前,您无法释放它,在这种情况下,它将位于调用此函数的代码
main()。当执行return时,在该点之后不会执行任何操作,因此将永远不会执行
free()


您必须更改其他一些位,例如mac的设置,但这应该是次要的。

我想您不熟悉C语言,因为它必须显式地管理内存

首先,
uint8_t mac[6]
字符ssid[20]在函数退出后不存在,因此在分配的wifi结构中指向它们的指针将指向可能是随机的内容。如果您知道大小始终相同,则处理此问题的一种方法是在结构中指定实际存储状态,如中所示:

typedef struct {
    uint8_t mac[6];
    char ssid[20];
} wifi_auth_t;
其次,当您分配
wifi
时,在最后一次使用它之前,您无法释放它,在这种情况下,它将位于调用此函数的代码
main()。当执行return时,在该点之后不会执行任何操作,因此将永远不会执行
free()


您必须更改其他一些位,例如mac的设置,但这应该是次要的。

返回wifi然后
免费(wifi)不起作用。和
char-ssid[20]在函数返回时不再存在。删除免费(wifi)似乎无法解决问题,我希望清除
char ssid[20]
,因此将其归因于wifi结构。您的
wifi\u auth
仅包含两个指针。您需要此结构具有
ssid[20]
或在该结构中具有另一个针对ssid的malloc调用。:)查看SDK API函数如何在structs
return wifi中返回值然后
免费(wifi)不起作用。和
char-ssid[20]在函数返回时不再存在。删除免费(wifi)似乎无法解决问题,我希望清除
char ssid[20]
,因此将其归因于wifi结构。您的
wifi\u auth
仅包含两个指针。您需要此结构具有
ssid[20]
或在该结构中具有另一个针对ssid的malloc调用。:)请参见SDK API函数如何在结构中返回值