打印变量类型结构元素
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?
我创建了一个结构来存储变量类型的元素:
#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?