c - 空指针、类型转换和可能的代码改进

标签 c casting void-pointers

考虑如下代码:

void get_value_by_peek_name(json_object *json_obj, const char *peak_name, void **value) {
    json_object *value_obj;
    if (json_object_object_get_ex(json_obj, peak_name, &value_obj))
        if (json_object_is_type(value_obj, json_type_double))
            sscanf(json_object_to_json_string(value_obj), "%lf", *value);
}

如预期的那样,此实现会生成警告:

format ‘%lf’ expects argument of type ‘double *’, but argument 3 has type ‘void *’

我正在寻找更好地实现此功能的建议,当然,还要避免上述警告。

在其他地方,还要考虑代码:

double timestamp;
void *holder;

// some other code...
// response_obj already initialized 
get_value_by_peek_name(response_obj, "timestamp", &holder);
timestamp = *((double *) holder);
printf("- timestamp: %lf\n", timestamp);

有没有什么好方法可以让这段代码更优雅,不用显式声明void pointerholder而是直接使用时间戳来保存值?

最佳答案

avoid the warning above.

  1. 定义 get_value_by_peek_name()void* 作为最后一个参数:

    void get_value_by_peek_name(json_object * json_obj, const char * peak_name, void * value)
    
  2. 确保 holder 指向一个 double(或者至少指向足够的内存,它也正确对齐以容纳一个 double),然后

  3. 在对 sscanf() 的调用中正确地转换指针 取消引用它之前:

    sscanf(json_object_to_json_string(value_obj), "%lf", *((double**)value));
    

关于c - 空指针、类型转换和可能的代码改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32198919/

相关文章:

c - 使用 CMake 将共享库与静态链接起来

c - 为什么标准 C 库不需要分为头文件和实现文件?

java - 通过 ObjectInputStream 保存和加载类的 Arraylist

C - 表达式必须是可修改的左值

c - C 的 void* 除了让代码更地道之外还有其他用途吗?

c - AVR proteus 延迟不工作

ios - 如何在 Swift 中转换为泛型类型

java - 创建具有定义类型的 Hashmap 与对象相比有性能优势吗?

c - C 语言是否只为 void 指针指定任何隐式初始化?

c - 如何从 STDIN 读取 C 函数并在程序中运行它?