Работа с malloc - найти ошибку в коде - C (СИ)
Формулировка задачи:
Всем привет.
Написал программу, которая выделяет память под двумерный массив и сохраняет в него имена. Размер выделяемой памяти зависит от количества и длины слов, которое определяется пользователем. Программка рассчитана на сохранение n-го количества слов, которое также определяется пользователем в начале программы (при запуске).
Вот, собственно, и сам код программы:
Все подробно прокомментировал. Программка выполняется только если вводить два имению Если больше - зависает. Видимо у меня где-то ошибка в понимании указателей или функции malloc(). Прошу помочь найти ошибку в коде.
Спасибо.
#include <stdio.h>
#include <string.h>
// функция выделения памяти для одного слова. На входе m - количество букв, определенное с помощью strlen(). *mass - указатель на указатель
void memory_for_string(char *mass, int m)
{
*mass = (char *)malloc((m+1)*sizeof(char)); // прибавляем к переменной 'm' 1 для выделения места под знак конца строки
}
int main(void)
{
int m=0, n=0, i=0;
char **mass, str[20]; // **mass - указатель на указатель. str - временный массив для определения длины введенного слова
puts("Please, enter a number of strings"); // пожалуйста, введите число строк
scanf("%d", &n);
fflush(stdin); // очищаем стандартный поток после scanf()
mass = (char *)malloc(n*sizeof(char *)); // выделяется память под массив указателей, адрес первой ячейки сохраняется в mass
while(i<n) // выполнять, пока не введено n-е количество имен
{
printf("Please, enter the name %d: ", i+1); // пожалуйста, введите i-е имя
gets(str); // сохраняем введенное слово
m = strlen(str); // определяем длину слова и сохраняем в m
memory_for_string(mass+i, m); // запускаем функцию для выделения памяти под длину слова
strcpy(*(mass+i), str); // копируем слово в выделенную память
i++;
}
i=0;
while(i<n)
{
printf("\nThe name %d is: %s", i+1, *(mass+i));
i++;
}
return 0;
}Решение задачи: «Работа с malloc - найти ошибку в коде»
textual
Листинг программы
typedef int shoesize_t; /*...*/ shoesize_t * arr = malloc(sizeof(shoesize_t) * NUMBER_OF_SHOES);
Объяснение кода листинга программы
- В первой строке определен тип данных
shoesize_t, который представляет размер обуви. - В следующей строке происходит выделение памяти с помощью функции
malloc(). Выделяется память для массиваarrтипаshoesize_t, где каждый элемент массива будет содержать один размер обуви. Размер массива определяется переменнойNUMBER_OF_SHOES.