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

时间:2019-11-11 02:08:13

标签: c esp32

我正在编写一个函数,该函数将返回带有两个字符串变量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);

}

1 个答案:

答案 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的方式,但这应该很小。