c - 打印可变类型的结构元素
问题描述
我创建了一个结构来存储变量类型的元素:
#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
解决方案
printf("Struct2: {value: %d | type: %d}\n", *((int *) val3.value), val3.type);
这应该可以完成这项工作。
Avoid *
拥有任何类型的地址。你已经存储&number
在里面了。现在如果你想打印它,首先你需要访问那个地址。void *
如果没有类型转换,您将无法访问存储在其中的地址。这是因为,编译器不知道该地址有多少字节需要被访问。void *
只是指向该地址的开头。
因此,为了告诉编译器我们需要访问sizeof(int)
字节,我们首先将其类型转换为(int *)
,然后获取该地址的值,我们执行*((int *) val3.value)
.
在这里考虑阅读更多关于void *
:
void* 是什么意思以及如何使用它?