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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.05.2014, 06:21   #1
Nata Golden rose
Пользователь
 
Регистрация: 03.12.2008
Сообщений: 20
По умолчанию Подскажите пожалуйста правильно ли я, динамически распределяю память?

Добрый день,

Подскажите пожалуйста только недавно начали Си изучать и нам дали такое задание: Считать строку любой длины с клавиатуры и переделать ее в массив с динамическим выделением памяти, вот код который я написала, ошибки он не выдает, но я не знаю правильно ли он работает?, и можно ли таким способом выделить память?


Код:
#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[])
{ 
    char *S;
    int *p, i;
    int t = 20;
   
    
    
    
   printf("Введите предложение");
  
   gets(S); // считываю предложение
  
   p = (char*)malloc(strlen(S)+1);// выделяю память
   
   if(!p) //проверяю есть ли свободная память
   
   printf("Невозможно выделить память");
   
    return 1;
  
   char tab[*p]; //создаю массив
   
   strcpy(tab[i],S); //копирую строку в массив
    
   system("PAUSE"); 
   return 0;
}
Nata Golden rose вне форума Ответить с цитированием
Старый 16.05.2014, 08:48   #2
kineziz
Форумчанин
 
Регистрация: 22.12.2011
Сообщений: 378
По умолчанию

Вы не освобождаете выделенную память.
Большинство хороших программистов делают свою работу не потому, что ожидают оплаты или признания, а потому что получают удовольствие от программирования.
kineziz вне форума Ответить с цитированием
Старый 16.05.2014, 10:03   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Nata Golden rose Посмотреть сообщение
но я не знаю правильно ли он работает?
Например, куда прочитает данные fgets(S)?
А для чего нужен tab вообще непонятно.
Копировать программа ничего не будет, независимо от того, будет выделена память или нет, потому что return выполняется всегда.

Данную программу никто даже и не компилировал.

Ответ - программа вообще не работает, ни правильно, ни неправильно.
waleri вне форума Ответить с цитированием
Старый 16.05.2014, 10:42   #4
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Nata Golden rose вы на правильном пути... Развивайте мысль. Не ошибается только тот кто ничего не делает
Код:
if(p == null) { 
      printf("Невозможно выделить память");
      return 1;
}
Обработку например можно так описать.
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 16.05.2014, 22:17   #5
Nata Golden rose
Пользователь
 
Регистрация: 03.12.2008
Сообщений: 20
По умолчанию

А если вот так сделать:

#include <stdio.h>
#include <stdlib.h>
#ibclude <string.h>

Код:
int main(int argc, char *argv[])
{
    char *S,*p;

    printf("Введите предложение");
    gets(S);                       // считываю предложение
    p = (char*)malloc(strlen(S)+1);// выделение памяти 
    if(!p) {                       //проверяю есть ли свободная память
        printf("Невозможно выделить память");
        return 1;
    }
    strcpy(p,S);              //копирую строку в массив
    printf(p);                //вывод содержимого динамического массива
    free(p);                  //освобождение памяти
    return 0;
}
Почему он все равно не работает?
Nata Golden rose вне форума Ответить с цитированием
Старый 17.05.2014, 02:04   #6
alekopoko
Форумчанин
 
Регистрация: 03.04.2013
Сообщений: 167
По умолчанию

gets не понимает сколько выделено памяти для указателя S
т.е. вместо
Код:
char *S;
надо так -
Код:
 char S[30];
или после char *S; -
Код:
S=(char*)malloc(sizeof(char[10]);

Последний раз редактировалось alekopoko; 17.05.2014 в 16:55.
alekopoko вне форума Ответить с цитированием
Старый 17.05.2014, 02:09   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Nata Golden rose,
Потому что вы не правильно пользуетесь функцией gets(S);

Эта функция на входе получает указатель на буффер, в котором она размещает строку.

Но у вас нет хранилища данных под строку.

А ваш указатель S в самом начале программы явно не проинициализирован.
А значит - содержит мусор. Некий случайный адрес.

gets записывает по этому адресу данные строки, перетирая при этом чужую информацию.
Это может приводить к самым непредсказуемым последствиям.

Иногда программа сможет нормально отработать. А иногда будет падать. Как повезет.

Правильное использование этой функции описано в документации.
Внимательно рассмотрите пример:
http://www.cplusplus.com/reference/cstdio/gets/
_Bers вне форума Ответить с цитированием
Старый 17.05.2014, 02:13   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

И да, кстати. Согласно вашему заданию:
Считать строку любой длины с клавиатуры и переделать ее в массив с динамическим выделением памяти

Ваше решение не верное.
Использование gets предполагает заранее известный размер хранилища данных.
Но поскольку по условию длина строки может быть какой угодно, то вы на это закладываться не можете.

А значит эта функция вам не подходит.

Последний раз редактировалось _Bers; 17.05.2014 в 02:15.
_Bers вне форума Ответить с цитированием
Старый 17.05.2014, 03:12   #9
vandit86
Новичок
Джуниор
 
Регистрация: 17.05.2014
Сообщений: 1
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main()
{
    char ch;
    int num=0;
    char *str=NULL,*aux=NULL;
    while((ch = getchar())!='\n')
    {
        if (str) free(str);

        str = (char *) malloc((num+2)*sizeof(char));
        if (!str) return 1;
        if (aux) strcpy(str,aux);
        free(aux);
        str[num]=ch;
        str[num+1]='\0';
        aux = (char *) malloc((num+2)*sizeof(char));
        if (!aux) return 1;
        strcpy(aux,str);
        puts(aux);

        num++;
    }
free (aux);
return 0;
}

Последний раз редактировалось vandit86; 17.05.2014 в 03:31.
vandit86 вне форума Ответить с цитированием
Старый 17.05.2014, 14:11   #10
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

vandit86, ваш код не компилируется.
_Bers вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамически распределяемая память skauzer_blr Помощь студентам 3 28.05.2012 09:29
Динамически распределяемая память!! Андрей frost Общие вопросы C/C++ 6 16.05.2012 19:19
подскажите пожалуйста что не правильно в скрипте. 6AT9 JavaScript, Ajax 1 25.11.2008 00:21