Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
lkruk
0 / 0 / 0
Регистрация: 14.10.2017
Сообщений: 89
1

Выделение памяти под структуры (malloc)

08.12.2017, 23:42. Просмотров 1032. Ответов 5
Метки нет (Все метки)

Доброго времени суток! Нужна помощь в выделении памяти для структуры с указателями.
Можете подсказать,что не так. Заранее спасибо

Вот код

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <stdio.h> 
#include <stdlib.h> 
#include <locale.h> 
#include <conio.h>
//#include "structura.h"
 
struct detail {
char name[50];
char detail_shape[50]; 
char amount[50]; 
char material[50]; 
char strength[50];
} detail_list[100];
 
 
void enter_detail() { 
FILE*fp; 
fp=fopen("Detail_list.txt","a+"); 
 
int num; 
 
char d[20]; 
 
printf("Введите номер:\n"); 
printf("Струкутура №: ");
scanf("%d", &num); 
 
printf("Введите Имя:"); 
scanf("%s",&detail_list[num].name); 
fprintf(fp, "Название детали №%d: %s\n",num,detail_list[num].name); 
 
printf("Введите форму детели:"); 
scanf("%s", &detail_list[num].detail_shape); 
fprintf(fp, "Форма детали №%d: %s\n",num,detail_list[num].detail_shape); 
 
printf("Введите объем детали:"); 
scanf("%s",detail_list[num].amount); 
fprintf(fp,"Объем детали №%d: %s\n",num, detail_list[num].amount); 
 
printf("Введите материал детали:"); 
scanf("%s",&detail_list[num].material); 
fprintf(fp,"Материал детали №%d: %s\n",num,detail_list[num].material); 
printf("Введите прочность детали:"); 
scanf("%s",detail_list[num].strength); 
fprintf(fp, "Прочность детали №%d: %s\n",num,detail_list[num].strength); 
fprintf(fp, "---------------------\n"); 
fclose(fp); 
system("cls");
} 
 
void detail_spisok(){ 
char mass[400]; 
FILE*list; 
list=fopen("Detail_list.txt","a+"); 
fread(mass,1,400,list); 
printf(mass); 
fclose(list); 
} 
 
void ukazateli() { 
int i; 
printf("Введите номер структуры:\n"); 
scanf("%d", &i); 
 
struct detail *p; 
 
p=&detail_list[i]; 
printf("<============================>\n");
printf("Название детали:  %s\n",p->name); 
printf("Форма детали: %s\n",p->detail_shape); 
printf("Объем детали:  %s\n",p->amount); 
printf("Материл детали:  %s\n",p->material); 
printf("Прочность детали:  %s\n",p->strength); 
printf("<============================>\n");
;
} 
 
void write_struct() { 
int i; 
printf("Введите номер структуры:\n"); 
printf("Cтруктура №: ");
scanf("%d",&i); 
struct detail *p; 
 
p=(struct detail*) malloc (sizeof(struct detail));
 
printf("<============================>\n");
printf("Введите название детали:"); 
scanf("%s",&p->name); 
printf("Ведите форму детали:"); 
scanf("%s",&p->detail_shape); 
printf("Введите объем детали:"); 
scanf("%s",&p->amount); 
printf("Введите материал детали:");
scanf("%s",&p->material); 
printf("Ведите прочность детали:"); 
scanf("%s",&p->strength); 
printf("<============================>\n");
system("cls");
} 
 
 
 
int main () { 
int s,b; 
setlocale(LC_ALL, "Russian"); 
FILE*fp; 
fp=fopen("Detail_list.txt","a+"); 
 
 
do { 
printf("<===============================================>");
printf("\n  <==================>Mеню<==================>");
printf("\n<===============================================>");
printf("\n\n1)Ввести данные в структуру двумя способами\n");
printf("2)Вывести данные структуры двумя способами\n");
printf("3)Выход \n ");
printf("<============================>\n");
printf("\nВведите номер пункта меню: "); 
scanf("%d", &s); 
if (s==3) break; 
switch(s) { 
case 1: 
printf("<============================>\n");
printf("Ввести данные в структуру:\n");
printf("1)В текстовый файл\n") ;
printf("2)Через указатель на массив\n"); 
printf("<============================>\n");
printf("Введите номер пункта меню: ");
scanf("%d", &s);
 
switch(s) { 
 
case 1: 
enter_detail(); 
break; 
case 2: 
write_struct(); 
break; 
} 
break; 
case 2: 
printf("<============================>\n");
printf("Вывести данные из структуры:\n");
printf("1) Из текстового файла\n");
printf("2) Через указатель на массив\n"); 
printf("<============================>\n");
printf("Введите номер пункта меню: ");
scanf("%d", &s); 
switch(s){ 
 
case 1: 
detail_spisok(); 
break; 
case 2: 
ukazateli(); 
break; 
} 
break; 
 
} 
} 
while(s>0); 
 
system ("pause"); 
return 0; 
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.12.2017, 23:42
Ответы с готовыми решениями:

Динамическое выделение памяти под структуры
Такая ситуация. Необходимо написать функцию ввода структуры c консоли void vvod(student &amp;man). Так...

Динамическое выделение памяти, нужен ли <malloc.h>?
если используешь функцию malloc, обязательно перед этим подключать соответствующую библиотеку...

Компилятор ругается на выделение памяти malloc
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;string.h&gt; #include &lt;locale.h&gt; /* СТУДЕНТ: ...

Malloc (выделение памяти двумерному массиву) - проверить код
Здравствуйте, подскажите пожалуйста, есть ли логические ошибки в блоке &quot;Выделения памяти:&quot;? План...

Определить, сколько памяти выделил malloc под массив
Подскажите, пожалуйста, можно ли узнать, сколько памяти выделено под массив, на который ссылается...

5
spvert
222 / 105 / 34
Регистрация: 25.11.2017
Сообщений: 377
Завершенные тесты: 1
08.12.2017, 23:46 2
Ванговать сложно. В чем проявляется это не так и в какой момент?
Навскидку не вижу чистки памяти.
Навскидку не увидел возвращающей указатель функции detail_list()
0
D3m1an
174 / 138 / 66
Регистрация: 11.08.2016
Сообщений: 473
Завершенные тесты: 1
09.12.2017, 00:11 3
spvert, это структура, не функция.

Цитата Сообщение от lkruk Посмотреть сообщение
struct detail {
char name[50];
char detail_shape[50];
char amount[50];
char material[50];
char strength[50];
} detail_list[100]; <---
0
lkruk
0 / 0 / 0
Регистрация: 14.10.2017
Сообщений: 89
09.12.2017, 00:28  [ТС] 4
Насчёт чистик памяти согласен просто заново писал забыл. Проблема у меня в том ,что при выводе ранее записанной структуры выводятся пустые поля .
0
spvert
222 / 105 / 34
Регистрация: 25.11.2017
Сообщений: 377
Завершенные тесты: 1
09.12.2017, 12:22 5
Это вы про функцию detail_spisok()?
А с чего вы ожидаете, что вы что-то прочитаете из файла, если открываете его с конца (флаг "a+")?
Открывайте с "r" и все заработает.

Ну и вообще писать так структуры в файл это некомильфо.
Бинарную структуру лучше писать не как текст. write(..., ptr, sizeof(struct)) будет эффективнее. И читается так же зараз. И массив точно так же читается зараз.
А если писать как текст, то выравнивать по ширине полей. Чтобы можно было считать как структуру.
0
lkruk
0 / 0 / 0
Регистрация: 14.10.2017
Сообщений: 89
10.12.2017, 12:31  [ТС] 6
Я имею ввиду функцию ukazateli и write struct.

Добавлено через 23 часа 37 минут
Так как мне сделать это? Подскажите пожалуйста
0
10.12.2017, 12:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2017, 12:31

Выделение памяти под структуру
Здравствуйте! Задача - написать модуль для работы со строками. Структуру менять нельзя, можно...

Выделение памяти под структуру
#define SIZE 45 #include&lt;stdio.h&gt; struct film{ char title; int rating; };

Выделение памяти под структуру
Как известно компилятор применяет выравнивание данных для структуры. Мне интересно, в том случае,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru