Динамическая структура с динамическим массивом внутри - C (СИ)
Формулировка задачи:
#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);
}Решение задачи: «Динамическая структура с динамическим массивом внутри»
#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)).