Динамическая структура с динамическим массивом внутри - 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);
}

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

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]);
    }
}

9   голосов, оценка 4.000 из 5


СОХРАНИТЬ ССЫЛКУ