Печать элементов структуры переменного типа - PullRequest
1 голос
/ 22 сентября 2019

Я создал структуру для хранения элементов переменного типа:

#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}
Struct2: {значение: -531387940 |введите: 1}

Как правильно напечатать это?Я также положил это здесь: https://onlinegdb.com/S17HrvNPB

1 Ответ

3 голосов
/ 22 сентября 2019
printf("Struct2: {value: %d | type: %d}\n", *((int *) val3.value), val3.type);

Это должно сделать работу.

A void * содержит адрес любого типа.Вы сохранили &number в нем.Теперь, если вы хотите распечатать его, прежде всего вам нужно получить доступ к этому адресу.Вы не можете получить доступ к адресу, который хранится в void * без ввода типа.Это потому, что компилятор не поймет, сколько байтов по этому адресу необходимо получить.void * просто указывает на начало этого адреса.

Итак, чтобы сообщить компилятору, что нам нужно получить доступ к sizeof(int) байтам, мы сначала приведем его к типу (int *), а затем, чтобы получить значение по этому адресу, мы сделаем *((int *) val3.value).

Здесь вы можете прочитать больше о void *:
Что означает void * и как его использовать?

...