Динамическая структура с динамическим массивом внутри - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Осваиваю динамическое выделение памяти в Си, но тут хорошенько затормозил. Первый цикл ввода выполняется, а второй доходит до ввода p[1].hello[0] и выдаёт ошибку. Кто бы мне мозги на место поставил. :>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h> 
#include <malloc.h>
 
struct complex
{
    int x;
    int y;
    int *hello;
};
 
int main()
{
    setlocale(LC_ALL, "rus");
    
    complex *p;
    int i, n;
 
    printf("Введите n: ");
    scanf("%d", &n);
    
    p = (complex*)malloc(sizeof(complex)*n);
    p->hello = ( int* ) malloc(sizeof(int)*3*n);
    
    for( i = 0; i < n; i++ )
    {
        printf("\nВведите p[%d].x = ", i);
        scanf("%d", &p[i].x);
        printf("\nВведите p[%d].y = ", i);
        scanf("%d", &p[i].y);
        printf("\nВведите p[%d].hello[0] = ", i);
        scanf("%d", &p[i].hello[0]);
        printf("\nВведите p[%d].hello[1] = ", i);
        scanf("%d", &p[i].hello[1]);
        printf("\nВведите p[%d].hello[2] = ", i);
        scanf("%d", &p[i].hello[2]);
    }
 
    for( i = 0; i < n; i++ )
    {
        printf("\n%d", p[i].x);
        printf("\n%d", p[i].y);
        printf("\n%d", p[i].hello[0]);
        printf("\n%d", p[i].hello[1]);
        printf("\n%d", p[i].hello[2]);
    }
 
    free(p);
 
    while(1);
}

Решение задачи: «Динамическая структура с динамическим массивом внутри»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <locale.h> 
#include <malloc.h>
 
struct complex
{
    int x;
    int y;
    int *hello;
};
 
void getmemory(complex **, int );
 
int main()
{
    setlocale(LC_ALL, "rus");
    
    complex *p;
    int i, n;
 
    printf("Введите n: ");
    scanf("%d", &n);
    
    p = (complex*)malloc(sizeof(complex)*n);
    p->hello = (int *)malloc( sizeof( int ) * 3 );
    for( i = 0; i < n; i++ )
    {
        printf("\nВведите p[%d].x = ", i);
        scanf("%d", &p[i].x);
        printf("\nВведите p[%d].y = ", i);
        scanf("%d", &p[i].y);
        printf("\nВведите p[%d].hello[0] = ", i);
        scanf("%d", &p[i].hello[0]);
        printf("\nВведите p[%d].hello[1] = ", i);
        scanf("%d", &p[i].hello[1]);
        printf("\nВведите p[%d].hello[2] = ", i);
        scanf("%d", &p[i].hello[2]);
    }
 
    for( i = 0; i < n; i++ )
    {
        printf("\n1. %d", p[i].x);
        printf("\n2. %d", p[i].y);
        printf("\nD3. %d", p[i].hello[0]);
        printf("\nD4. %d", p[i].hello[1]);
        printf("\nD5. %d", p[i].hello[2]);
        printf("\n");
    }
 
    free(p);
 
    getmemory( &p, n );
 
    for( i = 0; i < n; i++ )
    {
        printf("\n1. %d", p[i].x);
        printf("\n2. %d", p[i].y);
        printf("\nD3. %d", p[i].hello[0]);
        printf("\nD4. %d", p[i].hello[1]);
        printf("\nD5. %d", p[i].hello[2]);
        printf("\n");
    }
 
    free(p);
 
    while(1);
}
 
void getmemory(complex** ptr, int size)
{
    int i;
 
    *ptr = (complex *)malloc( sizeof( complex ) * size );
    (*ptr + i)->hello = (int*) malloc(sizeof(int) * 3);
    for( i = 0; i < size; i++ )
    {
        printf("\nВведите p[%d].x = ", i);
        scanf("%d", ptr[i]->x);
        printf("\nВведите p[%d].y = ", i);
        scanf("%d", ptr[i]->y);
        printf("\nВведите p[%d].hello[0] = ", i);
        scanf("%d", ptr[i]->hello[0]);
        printf("\nВведите p[%d].hello[1] = ", i);
        scanf("%d", ptr[i]->hello[1]);
        printf("\nВведите p[%d].hello[2] = ", i);
        scanf("%d", ptr[i]->hello[2]);
    }
}

Объяснение кода листинга программы

В этом коде определен тип структуры complex с полями x, y и динамическим массивом hello типа int. Структура используется для создания динамического массива структур с помощью функции malloc. Пользователю предлагается ввести значения для полей x, y и элементов массива hello для каждого элемента массива структур. Значения сохраняются в переменных соответствующих полей структуры. Затем выводится содержимое всех полей структуры на экран. После этого память, выделенная под массив структур, освобождается с помощью функции free. Затем снова запрашивается размер массива и выделяется память под новый массив структур с помощью функции getmemory. Затем снова запрашиваются значения для полей структуры и выводятся на экран. После этого память, выделенная под новый массив структур, освобождается с помощью функции free. В конце программы установлен бесконечный цикл, который никогда не завершается (while(1)).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5
Похожие ответы