Stworzyłem unię i umieściłem w niej różne typy tablicy. Wydrukowałem wydruki w kolejności i naprawdę nie zrozumiałem niektórych punktów.

1) Dlaczego długość mojej tablicy znaków zawsze wynosi 8, nawet jeśli zawartość jest inna? W środku jest tylko „cześć”. I dlaczego wyjście to „Koty rock!” kiedy próbuję drukować po raz drugi. Nie umieściłem czegoś takiego w tablicy.

2) Znowu problem z długością. Długość wszystkich moich tablic wynosi 8, nawet długość połączenia. Czemu?

3) Moje ostatnie pytanie dotyczy tego, dlaczego wartość podwójnej liczby zmieniła się, gdy próbuję wydrukować po raz drugi.

Wysyłam ci mój kod i wyrzucam, że dostaję. Przepraszam za długi post, ale jestem naprawdę zdezorientowany.

char: hello, 8
double: 5.557111111111111, 8
int: 1937006915 1668248096 8555, 8

char: Cats rock!
double: 0.000000000000000
int: 1937006915 1668248096 8555
size of union: 8

Mój kod

#define NUM1 5.557111111111111

#define NUM2 1937006915
#define NUM3 1668248096
#define NUM4 8555
#include <stdio.h>

/*created an union*/
typedef union {
    char  * array1;
    double num;
    int * array2;
} myunion;

int main(int argc, char ** argv)
{
    /* declaring union variable */
    myunion uni;
    /* creating my string */
    char strarray[] = "hello";

    /* declare an int array*/
    int numarray[] = { NUM2, NUM3, NUM4 };

    /* assign the string to the char pointer in the union */
    uni.array1 = strarray;

    /*  print the union and the sizeof of the pointer */
    printf("char: %s, %zu\n", uni.array1,sizeof(uni.array1));

    /* assign NUM1 to the double part of union */
    uni.num = NUM1;

    /* print the double and its sizeof */
    printf("double: %10.15f, %zu\n", uni.num, sizeof(uni.num));

    /* assign array2 of union  to the numarray */
    uni.array2 = numarray;

    /* print the values and the sizeof */
    printf("int: %d %d %d, %zu\n", uni.array2[0], uni.array2[1], uni.array2[2], sizeof(uni.array2));

    /* print the char array, double and int array */
    printf("\nchar: %s \ndouble: %10.15f \nint: %d %d %d\n",uni.array1, uni.num, uni.array2[0], uni.array2[1], uni.array2[2]);

    /* print the size of the union */
    printf("size of union: %zu\n", sizeof(uni));

    return 0;
}
1
Ahmet Tanakol 18 luty 2012, 22:48

2 odpowiedzi

Najlepsza odpowiedź

sizeof(uni.array1) to zawsze 8 na platformach 64-bitowych i 4 na platformach 32-bitowych, ponieważ przyjmuje rozmiar wskaźnika, nie wiedząc, ile danych według Ciebie może znajdować się za tym wskaźnikiem. Podobnie w przypadku tablic. Wskaźniki C, które wskazujesz na tablicę, są „głupie” i nie rozumieją, jak duża jest tablica — musisz przekazać te informacje osobno.

Obejmuje to pytania z części 1 i 2. Lubimy odpowiadać tutaj na konkretne pytania, więc możesz przenieść trzecie zapytanie do osobnego postu.

2
John Zwinck 18 luty 2012, 22:54

Twoja unia w rzeczywistości nie zawiera tablic, zawiera tylko (jeden z) dwóch wskaźników. Rozmiar wskaźnika na twoim komputerze to 8. Jeśli chcesz, aby tablice były częścią unii, zrób to w ten sposób

typedef union {
    char array1[MAX*8]; /* or whatever */
    double num;
    int array2[MAX];
} myunion;

Tablice muszą mieć stałą długość. Taka jest natura typów w czasie kompilacji.

1
alexis 18 luty 2012, 22:57