首页 > 解决方案 > 打印可变类型的结构元素

问题描述

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

#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:警告:从指针转换为不同大小的整数 [-Wpointer-to-int-cast]
Struct1: {value: Hello | 类型:0}
Struct2:{值:再见 | 类型:0}
结构2:{值:-531387940 | 类型:1}

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

标签: cpointersvoid

解决方案


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

这应该可以完成这项工作。

Avoid *拥有任何类型的地址。你已经存储&number在里面了。现在如果你想打印它,首先你需要访问那个地址。void *如果没有类型转换,您将无法访问存储在其中的地址。这是因为,编译器不知道该地址有多少字节需要被访问。void *只是指向该地址的开头。

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

在这里考虑阅读更多关于void *
void* 是什么意思以及如何使用它?


推荐阅读