c - 使用 void* 更改字符
问题描述
我正在尝试从 Wi-Fi 模块解析 mac 地址,但我遇到了一些麻烦.. 当我调用wifi_get_mac()
时,它在解析状态下工作正常,在on_get_mac_result_line
之后我得到 mac 地址sscanf
,但是当我回到了wifi_get_mac
,mac只是随机的..
static void* wifi_process_line_data;
static void (*wifi_process_line_func)(void* data, const char* line, int length);
static void on_get_mac_result_line(void* data, const char* line, int length)
{
if (wifi_state != STATE_IDLE) {
char mac[length];
char *p = mac;
if (sscanf(line, "%17s", mac) == 1) {
*(char*) data = mac;
}
}
}
char* wifi_get_mac(void){
static char mac[17];
char *p = mac;
wifi_process_line_data = p;
wifi_process_line_func = on_get_mac_result_line;
if (wifi_perform_s2w_command("AT+NMAC=?\n") && mac[0] != '\0') {
return '\0';
}
return mac;
}
我知道这可以获取 rssi
static void on_get_rssi_result_line(void* data, const char* line, int length)
{
if (wifi_state != STATE_IDLE) {
int rssi;
if (sscanf(line, "%d", &rssi) == 1) {
*(int*)data = rssi;
}
}
}
int wifi_get_rssi(void)
{
int rssi = INT_MAX;
wifi_process_line_data = &rssi;
wifi_process_line_func = on_get_rssi_result_line;
if (wifi_perform_s2w_command("AT+WRSSI=?\n") && rssi != INT_MAX) {
return rssi;
}
return INT_MAX;
}
解决方案
char mac[length];
是on_get_mac_result_line
函数的局部。不应尝试在该功能之外访问它。
您必须将整个char
数组复制到data
目标中,以使结果可用于调用函数 ( wifi_get_mac
)。例如。通过使用strncpy
:
strncpy((char*) data, mac, 17);
推荐阅读
- python - 根据列值的格式删除 csv 文件中的行
- ios - module.GetUUIDString() 在 linux 中为零,但在 Mac 中对于相同的 .app 和 crashlog 文件工作正常
- php - 如何以元素列表的形式构造 xml 文件
- laravel - 如何控制 Laravel 中的数据重复?
- css - 是否有可能使用 CSS 实现这种级别的透明度和饱和度?
- keras - 将 3D CNN 从 Keras 转换为 Pytorch
- python - 按特定变量拆分训练和测试数据
- python - 主线程中的Python未捕获异常不会杀死线程
- androidx - lifeCycler-extensions 的替代品是什么
- typescript - 是否有简化以下联合类型 TUnitTransform 的功能?