вывод на печать различных типов массивов объединения - PullRequest
1 голос
/ 18 февраля 2012

Я создал объединение и поместил в него различные типы массивов.Я напечатал выходные данные в порядке, и я действительно не понял некоторые пункты.

1) Почему длина моего массива char всегда 8, даже если содержимое отличается?Есть только "привет" внутри него.И почему вывод "Кошачьи скалы!"когда я пытаюсь напечатать во второй раз.Я не помещал ничего подобного в массив.

2) Снова проблема длины.Длина всех моих массивов составляет 8, даже длина объединения.Почему?

3) Мой последний вопрос - почему значение двойного числа изменилось, когда я пытаюсь напечатать второй раз.

Я отправляю вам свой код и отправляю его.Извините за длинный пост, но я действительно запутался.

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

мой код

#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;
}

Ответы [ 2 ]

2 голосов
/ 18 февраля 2012

sizeof(uni.array1) всегда равно 8 на 64-битных платформах и 4 на 32-битных, потому что он принимает размер указателя, не зная, какой объем данных, по вашему мнению, может находиться за этим указателем. Аналогично для массивов. Указатели на C, которые вы указываете на массив, «тупые» и не понимают, насколько велик массив - вам нужно передавать эту информацию отдельно.

Это касается вопросов 1 и 2. Здесь мы хотели бы ответить на конкретные вопросы, поэтому не стесняйтесь переносить третий запрос в отдельный пост.

1 голос
/ 18 февраля 2012

Ваш союз на самом деле не содержит массивов, он просто содержит (один из) двух указателей.Размер указателя на вашем компьютере равен 8. Если вы хотите, чтобы массивы были частью объединения, сделайте это следующим образом

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

Массивы должны иметь фиксированную длину.Такова природа типов во время компиляции.

...