Компилятор ругается на выделение памяти malloc - C (СИ)
Формулировка задачи:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
/*
СТУДЕНТ:
фамилия, имя, отчество (строки по 15 символов);
номер зачетной книжки (целое шестизначное число, уникальное поле);
дата рождения (в формате дд.мм.гггг).
*/
// объявляем структу СООБЩЕНИЕ
struct STUDENT {
int ID_STD; //уникальное поле
char FIO[15];
char DATE[10];
} ;
int main(int argc, char *argv[]){
setlocale(LC_ALL,"RU");
int ARR_SIZE = 0; // размер массива,
int i = 0; //управляющая перенная цикла
char SearchString[10]; //переменная для поиска
struct STUDENT *d; // указатель на массив структцры
printf("Введите размер: ");
scanf("%i", &ARR_SIZE); // сохраняем в переменной введенный размер
d = (struct STUDENT*)malloc(ARR_SIZE*sizeof(STUDENT)); // выделяем память для массива
if(d == NULL)
return -1; // если памяти нет, то выход с ошибкой
printf("Введите данные о студенте:\a\n");
for(i = 0; i < ARR_SIZE; i++){ // цикл заполнения структуры
printf("%i:\n",i+1);
printf("Номер зачётной книги: ");
scanf("%d*c", &d[i].ID_STD);
printf("ФИО: ");
gets("%s*c", d[i].FIO);
printf("Дата: ");
gets("%s*c", d[i].DATE);
}
printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\a");
printf("- - - - - - - - - - - - -Поиск- - - - - - - - - - - - - - \n\a");
printf("- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n\a");
printf("Введите номер зачётки студента для поиска:\a ");
gets("%s", &SearchString);
for(i = 0; i < ARR_SIZE; i++){
printf("%d\n",__LINE__);
if (strstr(d[i].DATE,SearchString) != NULL){
printf("- - - - - - - - - - - - - - - - - - - - - - - - - ");
printf("- - - -Результат поиска- - - - - - - \a\n");
printf("- - - - - - - - - - - - - - - - - - - - - - - - - ");
printf("Номер зачётной книги: %8.d\n",d[i].ID_STD);
printf("ФИО: %s\n",d[i].FIO);
printf("Дата: %s\n",d[i].DATE);
}
}
free(d); // освобождаем память, которая была выделена под массив
getch();
return 0;
}Решение задачи: «Компилятор ругается на выделение памяти malloc»
textual
Листинг программы
typedef struct {
int ID_STD; //уникальное поле
char FIO[15];
char DATE[10];
} STUDENT;
Объяснение кода листинга программы
- Типизация данных: структура STUDENT определена с помощью ключевого слова typedef, что позволяет использовать данную структуру как тип данных.
- Поле ID_STD типа int отвечает за уникальный идентификатор студента.
- Поле FIO типа char[15] отвечает за фамилию, имя и отчество студента, которые хранятся в массиве символов.
- Поле DATE типа char[10] отвечает за дату рождения студента, которая хранится в массиве символов.
Пример использования:
STUDENT student;
student = (STUDENT) malloc(sizeof(STUDENT));
if (student == NULL) {
printf(
Ошибка при выделении памяти\n); exit(1); } student->ID_STD = 12345; strcpy(student->FIO,Иванов Иван Иванович); strcpy(student->DATE,01.01.1991); free(student); // освобождение памяти Пояснение: - Выделяется память под указатель на структуру STUDENT с помощью malloc.
- Проверяется успешность выделения памяти, если память не может быть выделена, то выводится сообщение об ошибке и программа завершается.
- Задается значение полю ID_STD структуры student.
- С помощью функции strcpy копируются строки в поля FIO и DATE структуры student.
- Выделяемая память освобождается с помощью функции free.