Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.01.2013, 07:07   #1
murtukov
Новичок
Джуниор
 
Регистрация: 18.05.2011
Сообщений: 1
По умолчанию Работа с malloc() в СИ

Всем привет.

Написал программу, которая выделяет память под двумерный массив и сохраняет в него имена. Размер выделяемой памяти зависит от количества и длины слов, которое определяется пользователем. Программка рассчитана на сохранение n-го количества слов, которое также определяется пользователем в начале программы (при запуске).

Вот, собственно, и сам код программы:

Код:
#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(). Прошу помочь найти ошибку в коде.

Спасибо.

Последний раз редактировалось murtukov; 30.01.2013 в 07:47.
murtukov вне форума Ответить с цитированием
Старый 30.01.2013, 09:21   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В качестве догадки:
Код:
// функция выделения памяти для одного слова. На входе m - количество букв, определенное с помощью strlen(). *mass - указатель на указатель
char* memory_for_string(int m)
{
    return (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

    for(;i<n;i++)  // выполнять, пока не введено n-е количество имен
    {
        printf("Please, enter the name %d: ", i+1);  // пожалуйста, введите i-е имя
        gets(str);  // сохраняем введенное слово
        m = strlen(str);  // определяем длину слова и сохраняем в m
        mass[i]=memory_for_string(m);  // запускаем функцию для выделения памяти под длину слова
        strcpy(mass[i], str);  // копируем слово в выделенную память
    }

    i=0;
    while(i<n)
        {
          printf("\nThe name %d is: %s", i+1, mass[i]);
          i++;
        }
    return 0;
}
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.01.2013, 09:24   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,372
По умолчанию

Результат работы memory_for_string у вас теряется.
Напечатайте mass + i до и после вызова и убедитесь сами.
пишите уж лучше mass[i] = malloc() вместо memory_for_string()
Странно, что у вас не выдает предупреждения - вы пытаетесь присвоить указатель обычной переменной. Если уж очень хочется, учтите, что вам нужно изменить указатель, для этого надо передать указатель на указатель.

PS.
Посколько вам уже подробно ответили, на местo memory_for_string() почитайте про strdup()
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция malloc M9ICKO Общие вопросы C/C++ 26 26.07.2012 01:48
malloc в С++ _Kitten_ Помощь студентам 2 12.12.2011 19:20
Malloc Sabin4ik Общие вопросы C/C++ 12 18.02.2011 01:13
SIEGSEGV в malloc() TheVampire Общие вопросы C/C++ 0 25.09.2009 14:32
Проблема с malloc Обледеневший Общие вопросы C/C++ 7 14.09.2009 18:06