打印变量类型结构元素

Printing variable-type struct elements

我创建了一个结构来存储变量类型的元素:

#include <stdio.h>
#include <stdlib.h>

enum TYPES {TYPE_STRING, TYPE_NUMBER};
struct Value {
    void * value;
    int type; 
};

int main(int argc, char *argv[]) {


    // add element one
    struct Value val1;
    val1.value = "Hello";
    val1.type = TYPE_STRING;
    printf("Struct1: {value: %s | type: %d}\n", (char *) val1.value, val1.type);

    // can also initialize it like this
    struct Value val2 = {.value = "goodbye", .type = TYPE_STRING};
    printf("Struct2: {value: %s | type: %d}\n", (char *) val2.value, val2.type);

    // how to initialize a number though?
    int number = 2;
    struct Value val3 = {.value = &number, .type = TYPE_NUMBER};
    printf("Struct2: {value: %d | type: %d}\n", (int) val3.value, val3.type);

}

但由于某些原因,value3 无法正确打印。

main.c:26:46: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
Struct1: {value: Hello | type: 0}
Struct2: {value: goodbye | type: 0}
Struct2: {value: -531387940 | type: 1}

打印这个的正确方法是什么?我也把它放在这里:https://onlinegdb.com/S17HrvNPB

printf("Struct2: {value: %d | type: %d}\n", *((int *) val3.value), val3.type);

这应该可以完成工作。

A void * 包含任何类型的地址。您已将 &number 存储在其中。现在如果你想打印它,首先你需要访问那个地址。如果不进行类型转换,您将无法访问存储在 void * 中的地址。这是因为,编译器不会理解需要访问该地址的多少字节。 void * 只是指向该地址的开头。

因此,为了告诉编译器我们需要访问 sizeof(int) 字节,我们首先将其类型转换为 (int *),然后为了获取该地址的值,我们执行 *((int *) val3.value)

这里考虑阅读更多关于 void *:
What does void* mean and how to use it?