Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выделение памяти для строки, один байт 
V
    Опции темы
Hoo
Дата 2.3.2007, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 23.7.2006

Репутация: нет
Всего: 1



привет
Код

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

int main ()
{
  char * buffer = (char*) malloc (sizeof(char));;

  scanf ("%s", buffer);
  printf ("String: %s\n", buffer);
  free (buffer);
  return 0;
}


почему если я выделяю память всего для одного символа при вводе больших не возникает ошибки?

Цитата

long
String: long



PM   Вверх
Fazil6
Дата 2.3.2007, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

почему если я выделяю память всего для одного символа при вводе больших не возникает ошибки?

а почему должна? Тут неопределенное поведение, в том числе и отсутствие всяких ошибок возможно. Просто ты этими лишними в данном случае ничего важного не портишь.
PM MAIL   Вверх
chaos
Дата 2.3.2007, 07:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



Hoo, а ты попробуй релизную версию проект собрать smile мож чего и увидешь
PM WWW   Вверх
Hoo
Дата 2.3.2007, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 23.7.2006

Репутация: нет
Всего: 1



спасибо


chaos, чего-то тоже самое, компилятор MinGW

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

а если str указывает на первый блок, а второй занят, то куда запишется вторая буква? Если например третий свободен, то в него?
и значение какого блока я получаю вызывая str[1], второго или третьего?

и как правильно сохранять введенную строку на C, если заранее не известен ее размер?
так?

Код

char *text[MAX_ARRAY];
int count;

void add(void)
{
    char *str;
    
    if(count < MAX_ARRAY)
    {
        if(str == NULL)
            printf("couldn't allocate memory\n");
        else
            str = (char*) malloc(sizeof(char));
            printf("enter string:\n");
            gets(str);
            text[count] = (char*) malloc ((strlen(str) + 1) * sizeof(char));
            if(text[count] == NULL)
                printf("couldn't allocate memory\n");
            else
                strcpy(text[count++], str);
    }
    else
        printf("array of string is full\n");
    free(str);
}



Это сообщение отредактировал(а) Hoo - 2.3.2007, 08:45
PM   Вверх
Fazil6
Дата 2.3.2007, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

а если str указывает на первый блок, а второй занят, то куда запишется вторая буква? Если например третий свободен, то в него?
и значение какого блока я получаю вызывая str[1], второго или третьего?

испортит следующий. Блоки памяти массивов непрерывные. Когда ты выходишь за границы, ты пишешь подряд.

Добавлено @ 10:15 
Цитата

и как правильно сохранять введенную строку на C, если заранее не известен ее размер?

gets для этого не подходит. Нужно использовать fgets
Код

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

imt maim(void)
{
     char str[10];
     int i;

     printf("input string : ");
     fgets(str, 10, stdin);
//удаление символа новой строки
     i = strlen(str) - 1;
     if(str[i] == '\n') str[i] = '\0';

     printf("string = %s", str);
     return 0;
}

PM MAIL   Вверх
Hoo
Дата 2.3.2007, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 23.7.2006

Репутация: нет
Всего: 1



Fazil6, спасибо, но мне заранее не известен размер строки, как это лучше всего сделать?
PM   Вверх
Fazil6
Дата 2.3.2007, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

но мне заранее не известен размер строки, как это лучше всего сделать?

выделяй достаточно большой буфер.   
PM MAIL   Вверх
seacat79
Дата 2.3.2007, 11:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 27.2.2007
Где: Украина, Одесса

Репутация: 1
Всего: 1



Код

#include <vector>
#include <stdio.h>

using namespace std;

int main() 
{
    vector<char> str;

    char s;

    while ( (s=getc(stdin)) != EOF)
    {
        str.push_back(s);
    }


    vector<char>::iterator reader;
    for (reader = str.begin(); reader != str.end(); reader++)
    {
        printf("%c",*reader);
    }
}


PM MAIL ICQ   Вверх
Fazil6
Дата 2.3.2007, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



seacat79, это на каком языке?
PM MAIL   Вверх
Hoo
Дата 2.3.2007, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 23.7.2006

Репутация: нет
Всего: 1



так и сделаю


seacat79, я на C99   smile 
PM   Вверх
seacat79
Дата 2.3.2007, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 27.2.2007
Где: Украина, Одесса

Репутация: 1
Всего: 1



По просьбам трудящихся  smile 

Код

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

#define BUFFER_SIZE 5

void die();

int main() 
{
    char *gigantos_string = NULL;
    char little_symbol = 0;
    long buffer_size = 0;
    long symbols_in = 0;

    if ((gigantos_string = malloc(BUFFER_SIZE)) == NULL)
    {
        die();
    }
    buffer_size+=BUFFER_SIZE;

    while ((little_symbol = getchar()) != EOF)
    {
        *(gigantos_string+symbols_in) = little_symbol;
        symbols_in++;
    
        if (symbols_in == buffer_size)
        {
            if ((gigantos_string = realloc(gigantos_string, buffer_size+BUFFER_SIZE)) == NULL)
            {
                printf("This string is very, very long... Do some with this\n");
                die();
            }
            buffer_size+=BUFFER_SIZE;
        }
    }
    printf("On today, you wrote:\n%s", gigantos_string);
    free(gigantos_string);
}

void die()
{
    printf("I'm die...\n");
    exit(-1);
}

PM MAIL ICQ   Вверх
0lmer
Дата 2.3.2007, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 3.12.2006

Репутация: нет
Всего: -1



256 символов под строку вполне хватает, если это не длиииииииинный путь до файла.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0756 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.