Инициализация массива структуры, вложенного в массив структуры в C - PullRequest
0 голосов
/ 21 апреля 2020

Цель состоит в том, чтобы включить массив структуры в другой массив другой структуры. Оба структурных массива должны быть объявлены и инициализированы отдельно. Предложенные вопросы и ответы так же имели только один компонент моего задания, но не эту или подобную комбинацию. Код, который я добавил здесь, является просто упрощенным примером. Все размеры и элементы массива известны до выполнения.

Это пример кода, который не может быть скомпилирован "Ошибка сегментации":

#include <stdio.h>
#include <string.h>

struct student_course_detail
{
    int  course_id;
    char course_name[50];
};

struct student_detail 
{
    int id;
    char name[20];
    // structure within structure
    struct student_course_detail *course[2]; 
}stu_data[2], *stu_data_ptr[2];


struct student_course_detail course_data[2] = {
  {71145, "Course 1"}, 
  {33333, "Course 2"},
}; 

struct student_detail stu_data[2] = {
    {1, "Anna", &course_data[1]},
    {2, "Tom", &course_data[2]}
};


int main() 
{
    stu_data_ptr[2] = &stu_data[2];

    printf(" Id is: %d \n", stu_data_ptr[0]->id);
    printf(" Name is: %s \n", stu_data_ptr[0]->name);


    printf(" Course Id is: %d \n", 
                         stu_data_ptr[0]->course[0]->course_id);
    //printf(" Course Name is: %s \n", 
    //                 stu_data_ptr[0]->course[0]->course_name);
    //printf(" Course Id is: %d \n", 
    //                     stu_data_ptr[0]->course[1]->course_id);
    //printf(" Course Name is: %s \n", 
    //                  stu_data_ptr[0]->course[1]->course_name);

    return 0;
}

Ссылка на пример кода: https://www.onlinegdb.com/Hk2NQ42OU

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

Член структуры course представляет собой массив из двух указателей на struct student_course_detail.

Судя по тому, как вы пытаетесь его инициализировать, это должен быть не массив, а простой указатель на struct student_course_detail :

struct student_course_detail *course;  // Pointer to a single student_course_detail structure

У вас есть похожие проблемы в других местах (stu_data_ptr).

Также не забывайте, что индексы массива ноль основание, поэтому &course_data[2] выходит за пределы массива course_data.

0 голосов
/ 21 апреля 2020

Когда вы определяете массив с n элементами, индекс элементов колеблется от 0 до n-1.

Таким образом, в этом случае все массивы имеют размер 2, поэтому элементы, которые вы имеете, индексируются 0 и 1.

Например, это недопустимо:

stu_data_ptr[2] = &stu_data[2]; //illegal

, вы можете сделать:

stu_data_ptr[1] = &stu_data[1];

или

stu_data_ptr[0] = &stu_data[0];//use this, since you use stu_data_ptr[0] later
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...