在 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 的设置方式,但这应该是次要的。