C вложенные структуры со списком

#c

#c

Вопрос:

Я создал структуру из массива 10 на 10 для хранения случайных чисел. Также создан список, чтобы каждый элемент содержал разные 10 на 10. Но когда я печатаю его, цифры как бы ломаются, я не знаю, неверны ли мои циклы for или есть что-то еще. Я надеюсь, что я правильно делаю список.

 struct Num
{
    int Numbers[10][10];

};

struct Hold
{
    struct Num *List;
}FullList;


int main(void)
{
    time_t t;
    int x;
    srand((unsigned) time(amp;t));
    printf("Enter the number of arrays you want to create: ");
    scanf("%d", amp;x);

    FullList.List = malloc(x * sizeof(int));
    if (FullList.List == NULL) {
        fprintf(stderr, "Malloc failed.n");
        exit(1);
    }
    int i, j, k;


    for(i=0;i<x;i  )
    {
        for(j=0;j<10;j  )
        {
            for(k=0;k<10;k  )
            {
                FullList.List[i].Numbers[j][k] = rand() % 255;

            }


        }
    }

    for(i=0;i<x;i  )
    {
        for(j=0;j<10;j  )
        {
            for(k=0;k<10;k  )
            {

                printf("%d  %d  %d  %d %d  %d  %d  %d  %d  %d n", FullList.List[i].Numbers[j][k]);

            }


        }
    }

    return 0;
}
  

Комментарии:

1. ImageList.List = malloc(x * sizeof(int)); неверно. Должно быть ImageList.List = malloc(x * sizeof(struct Num)); , сумма, которую вы выделяете , слишком мала. Кроме того, вы должны проверить значение, возвращаемое, malloc чтобы убедиться, что это не так NULL .

2. @TomKarzes что вы подразумеваете под слишком маленьким, как мне тогда распределять. Спасибо за ответ, кстати

3. Пожалуйста, не создавайте больше работы для других людей, вандализируя свои сообщения. Размещая в сети Stack Exchange, вы предоставляете Stack Exchange не подлежащее отзыву право в соответствии с лицензией CC BY-SA 4.0 на распространение этого контента (т. Е. Независимо от вашего будущего выбора). Согласно политике обмена стеками, распространяется версия post, не подвергшаяся вандализму. Таким образом, любой вандализм будет отменен. Если вы хотите узнать больше об удалении записи, пожалуйста, смотрите: Как работает удаление?

4. @Carl Похоже, что кто-то дал вам ответ, но дело в том, что вы выделяли пространство для x целых чисел, но вам нужно было место для x экземпляров struct Num . Каждая struct Num из них содержит массив из 100 целых чисел. Таким образом, выделенный размер был, по крайней мере, в 100 раз меньше. Это то, что вам действительно нужно понять.

Ответ №1:

Я собираюсь предположить ImageList , что это опечатка, и вы имели в виду FullList , что я буду использовать в своих примерах. Если это так, то вы неправильно выделяете память:

 FullList.List = malloc(x * sizeof(int));
  

Вы выделяете достаточно места для x int объектов, а не x для объектов типа struct Num . Вы не выделяете достаточно места для предполагаемого использования. Лучшим способом сделать это было бы

 FullList.List = malloc( x * sizeof *FullList.List )
  

Выражение sizeof *FullList.List эквивалентно sizeof (struct Num) ; это выделит достаточно места для x struct Num объектов, чего вы и хотите. В общем, вы должны записывать свои malloc вызовы как

 T *p = malloc( sizeof *p * N ); // for any non-function type T
  

или

 T *p = NULL;
...
p = malloc( sizeof *p * N );
  

Всегда проверяйте результат malloc вызовов , calloc , и realloc .

Комментарии:

1. спасибо, человек очень помог, но напечатанные цифры по-прежнему неверны, это первая строка матрицы «28 0 9 6422048 0 6422048 4200281 1 34 -1230284480» понятия не имею, откуда взялись эти цифры.

2. Оператор printf содержит множество спецификаторов формата (%d), но предоставляет только один параметр для печати (FullList.List[i].Numbers[j][k] ). Остальные %d ведут себя неопределенно, поэтому просто печатают случайные значения в стеке. Вы хотите, чтобы ваша печать имела только один%d в зависимости от того, как вы написали циклы.

3. @OutrageousBacon о, как я пропустил это, спасибо, чувак.