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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> наверно глупый вопрос... malloc(), по4ему не занимает заданное коли4ество 
V
    Опции темы
kostay
Дата 25.11.2007, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



вобшем вот изу4аю... непойму ведь маллок должен занять заданное коли4ество памяти... тогда по4ему я в результате полу4аю строку длинной более 10 символов... вобшем надо 4тобы давало не более МАХ, в 4ом ошибка?

Код

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


char *luemj(int max){
    char *ch;
        ch = (char *)malloc( sizeof(ch)*max );

        printf("Anna merkkijono: ");
     scanf("%s", ch);

        return ch;
}


int main(int argc, char* argv[])
{
    char *merkkijono;
        merkkijono = luemj(10);

     printf("Merkkijono oli : %s", merkkijono);

     free(merkkijono);

        scanf("%s", &merkkijono);
    return 0;
}

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


Эксперт
****


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

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



Цитата(kostay @  25.11.2007,  19:09 Найти цитируемый пост)
ch = (char *)malloc( sizeof(ch)*max );

Не совсем верно. sizeof(ch) скорей всего 4, sizeof( *ch) ==  1. Тебе нужно 2ое.
Цитата(kostay @  25.11.2007,  19:09 Найти цитируемый пост)
в 4ом ошибка?

После maloc сделай memset( ch, sizeof(*ch)*max, 0 );
PM MAIL WWW   Вверх
kostay
Дата 25.11.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



неа, не помогло ((

надобы както только malloc обойтись без мемсетов

я отвёл размер памети на 10 символов, так?
по4ему полу4ается больше? или то4нее какбудто память я вобше не занимал
PM MAIL   Вверх
bsa
Дата 25.11.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(kostay @ 25.11.2007,  18:41)
неа, не помогло ((

надобы както только malloc обойтись без мемсетов

я отвёл размер памети на 10 символов, так?
по4ему полу4ается больше? или то4нее какбудто память я вобше не занимал

На самом деле, тебя не касается, сколько памяти выделяет malloc на самом деле. Главное, что он выделяет не менее, чем ты попросил. А дальше уже твоя забота держать себя в рамках выделенной области памяти.
А потом, как ты определяешь, сколько памяти выделилось? Из твоего примера только видно, что ты из-за ошибки выделяешь в несколько раз больше, чем тебе надо (на это указал Daevaorn).
PM   Вверх
kostay
Дата 25.11.2007, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ок. так как мне всётаки сделать 4тобы возврашалось только МАХ коли4ество символов...

разве не так 4то когда функция возврашает return, то 4то вне выделенной области теряется?
и по4ему мне надо 1 а не 4? ведь один символ 4 бита?
PM MAIL   Вверх
bsa
Дата 25.11.2007, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(kostay @ 25.11.2007,  19:18)
ок. так как мне всётаки сделать 4тобы возврашалось только МАХ коли4ество символов...

разве не так 4то когда функция возврашает return, то 4то вне выделенной области теряется?
и по4ему мне надо 1 а не 4? ведь один символ 4 бита?

char - это МИНИМУМ 8 битов.
malloc выделяет память в БАЙТАХ (1 байт, обычно, равен 8 битам).

Цитата(man 3 malloc)
malloc() выделяет size байт и возвращает указатель на выделенную память. Выделенная память не инициализируется.

Код
char *cp; //cp - это указатель на char (для 32-х битных систем sizeof(cp) == 4, sizeof(*cp) == 1)
cp = (char*)malloc(10); //выделяем 10 байт памяти
return cp; //возвращаем указатель на выделенную область памяти


PM   Вверх
kostay
Дата 25.11.2007, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Код

char *luemj(int max){
    char *ch;
        ch = (char *)malloc( max );
        return ch;
}


int main(int argc, char* argv[])
{
    char *merkkijono;
        merkkijono = luemj(5);

        printf("Anna merkkijono: ");
     scanf("%s", merkkijono);
     printf("Merkkijono oli : %s", merkkijono);

     free(merkkijono);

        scanf("%s", &merkkijono);
    return 0;
}


тоесть так? непашет ( всёравно скока дал стока и плу4ил
PM MAIL   Вверх
Dov
Дата 25.11.2007, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



kostay, так делай:
Код

char *luemj(int max){
    char *ch;
    ch = (char *)malloc( sizeof(char) * (max + 1));    // + '\0'

    return ch;
}


int main(int argc, char* argv[])
{
    int max = 5; 
    char *merkkijono;
    merkkijono = luemj(max);
    
    printf("Anna merkkijono: ");
    fgets(merkkijono, max + 1, stdin);    // + '\0'

    printf("Merkkijono oli : %s\n", merkkijono);
    
    free(merkkijono);
    
    return 0;
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
kostay
Дата 25.11.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



спасибо!
можно пояснить?
особенно вот ето -> fgets(merkkijono, max + 1, stdin); по4ему обы4ный сканф не пойдёт?
PM MAIL   Вверх
Dov
Дата 25.11.2007, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Потому что обы4ный сканф не контролирует выход за пределы массива.


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
JackYF
Дата 25.11.2007, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Dov @  25.11.2007,  20:33 Найти цитируемый пост)
не контролирует выход за пределы массива

а если

Код

scanf("%.*s", max+1, &str);
?


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Dov
Дата 25.11.2007, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



JackYF, в scanf 'звёздочка' выполняет другую функцию, нежели в printf. Можно, конечно, написать так:
Код
scanf("%5s",  str);

Можно, даже, извратиться и вместо числа 5 записывать значение какой-нить переменной. Но, согласись, что это полнейший гемор. По-моему, гораздо проще юзать fgets. 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
JackYF
Дата 25.11.2007, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Dov @  25.11.2007,  22:47 Найти цитируемый пост)
в scanf 'звёздочка' выполняет другую функцию, нежели в printf.

мдэ? ну тогда

Цитата(Dov @  25.11.2007,  22:47 Найти цитируемый пост)
По-моему, гораздо проще юзать fgets.  

+1.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0567 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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