在 C 中返回具有字符串值的结构
Returning structs with string values in C
我正在编写一个函数,它将 return 一个包含两个字符串变量、SSID 和密码的结构。函数的目的是根据 mac 地址数据生成 SSID,该数据从硬件 api 调用,更新指向变量的指针。
该函数创建并 returns 自定义类型。当我用引号手动设置其中一个字符串变量时,调用函数可以正常接收数据。但是,当我将变量设置为另一个变量的值时,它不会。这里缺少什么?
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 = "Whosebug";
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);
}
我猜你不熟悉必须显式管理内存的 C。
首先,uint8_t mac[6];
和 char ssid[20];
在函数退出后不存在,因此在分配的 wifi 结构中指向它们的指针可能指向随机的东西。如果您知道大小始终相同,处理此问题的一种方法是在结构中指定实际存储,如:
typedef struct {
uint8_t mac[6];
char ssid[20];
} wifi_auth_t;
其次,当您分配 wifi
时,您不能释放它,直到最后使用它的地方,在这种情况下,它会在调用此函数 main()
的代码中的某个地方)。当 return 被执行时,在那之后什么也没有到达,所以 free()
永远不会被执行。
您必须更改其他一些位,例如 mac 的设置方式,但这应该是次要的。
我正在编写一个函数,它将 return 一个包含两个字符串变量、SSID 和密码的结构。函数的目的是根据 mac 地址数据生成 SSID,该数据从硬件 api 调用,更新指向变量的指针。
该函数创建并 returns 自定义类型。当我用引号手动设置其中一个字符串变量时,调用函数可以正常接收数据。但是,当我将变量设置为另一个变量的值时,它不会。这里缺少什么?
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 = "Whosebug";
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);
}
我猜你不熟悉必须显式管理内存的 C。
首先,uint8_t mac[6];
和 char ssid[20];
在函数退出后不存在,因此在分配的 wifi 结构中指向它们的指针可能指向随机的东西。如果您知道大小始终相同,处理此问题的一种方法是在结构中指定实际存储,如:
typedef struct {
uint8_t mac[6];
char ssid[20];
} wifi_auth_t;
其次,当您分配 wifi
时,您不能释放它,直到最后使用它的地方,在这种情况下,它会在调用此函数 main()
的代码中的某个地方)。当 return 被执行时,在那之后什么也没有到达,所以 free()
永远不会被执行。
您必须更改其他一些位,例如 mac 的设置方式,但这应该是次要的。