我正在编写一个函数,该函数将返回带有两个字符串变量SSID和密码的结构。该功能的目的是基于mac地址数据生成一个SSID,该数据是从硬件api调用的,该API更新了指向变量的指针。
该函数创建并返回自定义类型。当我用引号手动设置一个字符串变量时,调用函数会很好地接收数据。但是,当我将变量设置为另一个变量的值时,事实并非如此。这里缺少什么?
typedef struct {
char *ssid;
char *password;
} wifi_auth_t;
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_auth_t* wifi_set_ap_details() {
uint8_t mac[6];
wifi_auth_t *wifi;
wifi = (wifi_auth_t *)malloc(sizeof(wifi_auth_t));
getmac(mac);
for (int i = 0; i < 6; i++ ) {
printf("0x%.2X ", mac[i]);
}
printf("\n");
char ssid[20];
sprintf(ssid, "WifiDevice_%X%X%X", mac[3], mac[4], mac[5]);
wifi->ssid = ssid;
printf("%s\n", wifi->ssid);
wifi->password = "stackoverflow";
return wifi;
free(wifi);
}
int main() {
wifi_auth_t *wifi = wifi_set_ap_details();
printf("Wifi: %s\n", wifi->ssid);
printf("Pass: %s\n", wifi->password);
}
答案 0 :(得分:2)
我想您对必须显式管理内存的C不熟悉。
首先,uint8_t mac[6];
和char ssid[20];
在函数退出后不存在,因此在分配的wifi结构中指向它们的指针将指向可能是随机的东西。如果您知道大小将始终相同,则处理此问题的一种方法是在struct中指定实际的存储空间,例如:
typedef struct {
uint8_t mac[6];
char ssid[20];
} wifi_auth_t;
第二,当您分配wifi
时,您无法释放它,直到使用它的最后一个位置为止(在本例中,该位置位于调用此函数main()
的代码中)。执行return时,到达该点之后什么也没有,所以free()
永远不会执行。
您必须更改其他几项,例如设置mac的方式,但这应该很小。