GLib:获取D-Bus返回的字符串数组的元素数量
如何获取GLib中D-Bus返回的字符串数组长度
这里有两种实用方法可以解决你的需求,优先推荐第一种,代码更简洁高效:
方法一:直接提取数组并获取长度
利用g_variant_get直接将返回的变体数据解析为字符串数组(gchar**),再通过g_strv_length获取数组长度,无需手动迭代统计:
GVariant * val_returned = g_dbus_connection_call_sync(connection, SERVICE, OBJECT, IFACE, "GetStringsArray", NULL, G_VARIANT_TYPE("(as)"), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err); if (val_returned == NULL) { // 处理错误 g_error_free(err); return; } gchar **str_array = NULL; // 使用^符号转移数组的所有权给我们,后续需要用g_strfreev释放 g_variant_get(val_returned, "(^as)", &str_array); g_variant_unref(val_returned); // 获取数组长度 gsize array_len = g_strv_length(str_array); // 这里可以根据array_len动态分配内存,或者直接使用str_array // 示例:遍历数组 for (gsize i = 0; i < array_len; i++) { g_print("字符串%d: %s\n", i, str_array[i]); } // 最后释放数组内存 g_strfreev(str_array);
方法二:用迭代器统计长度(适合必须用迭代器的场景)
如果一定要基于已有的迭代器实现,可以先遍历一次统计数量,重置迭代器后再读取内容:
GVariant * val_returned = g_dbus_connection_call_sync(connection, SERVICE, OBJECT, IFACE, "GetStringsArray", NULL, G_VARIANT_TYPE("(as)"), G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err); if (val_returned == NULL) { // 处理错误 g_error_free(err); return; } g_autoptr(GVariantIter) iterator = NULL; g_variant_get(val_returned, "(as)", &iterator); g_variant_unref(val_returned); // 第一步:统计数组长度 gsize count = 0; const gchar *temp_str; while (g_variant_iter_next(iterator, "s", &temp_str)) { count++; } // 重置迭代器到起始位置 g_variant_iter_reset(iterator); // 根据长度动态分配内存(+1是为了兼容NULL终止的字符串数组规范) gchar **my_array = g_malloc0(sizeof(gchar*) * (count + 1)); // 第二步:读取实际字符串并填充到数组 gsize idx = 0; while (g_variant_iter_next(iterator, "s", &temp_str)) { my_array[idx++] = g_strdup(temp_str); } // 使用数组... for (gsize i = 0; i < count; i++) { g_print("字符串%d: %s\n", i, my_array[i]); } // 释放内存 for (gsize i = 0; i < count; i++) { g_free(my_array[i]); } g_free(my_array);
注意事项
- 方法一的
(^as)格式符中,^表示GLib会将数组的所有权转移给调用者,必须用g_strfreev释放,避免内存泄漏。 - 无论哪种方法,都要记得在使用完
GVariant后调用g_variant_unref释放资源。
内容的提问来源于stack exchange,提问作者Engineer999
相关产品推荐
相关产品推荐

