Перейти к содержанию
    

Почему может не работать malloc в Keil?

Делаю для sprintf. Если объявлять как буфер - работает. А так:

 

    char *SprintFBUF = NULL;
    SprintFBUF = (char*) malloc(400);

 

Печатает кракозябры. Что может быть не так?

 

Пробовал в C-Free - тоже работает:

 

    char *p = NULL;
    p = (char*) malloc(100);
    strcpy(p, mBUF);

    printf("\n%s\n", p);
    free(p);

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что произойдёт с адресом выделенной памяти после вторичного вызова функции?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Печатает кракозябры. Что может быть не так?

Проверяйте стек, вернее его переполнение, наползание кучи на стек и т.п. Вы же можете в отладчике посмотреть адреса, или вывести их в консольку? Можно ОЗУ заполнить каким-либо паттерном, чтобы определить что что портит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

    char *SprintFBUF = NULL;
    SprintFBUF = (char*) malloc(400);

 

Печатает кракозябры. Что может быть не так?

malloc может вернуть NULL, если не смог найти кусок памяти нужного вам размера. Вы проверяете SprintFBUF на NULL после malloc?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Делаю для sprintf. Если объявлять как буфер - работает. А так:

 

    char *SprintFBUF = NULL;
    SprintFBUF = (char*) malloc(400);

 

Печатает кракозябры. Что может быть не так?

 

Пробовал в C-Free - тоже работает:

 

    char *p = NULL;
    p = (char*) malloc(100);
    strcpy(p, mBUF);

    printf("\n%s\n", p);
    free(p);

а что должен печатать? Выделение памяти по malloc никак не должно инициализировать содержимое этой памяти. Попробуйте вместо printf("\n%s\n", p); сделать printf("\n%s\n%s\n", p,mBUF);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

malloc может вернуть NULL, если не смог найти кусок памяти нужного вам размера. Вы проверяете SprintFBUF на NULL после malloc?

Да, теперь проверяю. Так и происходит. Почему не выделяет - теперь основной вопрос.

 

if(SprintFBUF == NULL) {printf("\rNo Memory\r");}

 

а что должен печатать? Выделение памяти по malloc никак не должно инициализировать содержимое этой памяти. Попробуйте вместо printf("\n%s\n", p); сделать printf("\n%s\n%s\n", p,mBUF);

Этот кусок кода просто не показан. Конечно я печатаю в эту область sprintf'ом.

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, теперь проверяю. Так и происходит.
Значит памяти не хватает. Или урезайте осетра (запрашивайте меньше) или обеспечьте необходимое количество памяти для кучи. Как это сделать в keil я не знаю, подозреваю что у вас под кучу вообще памяти в настройках проекта не отводится. Читайте документацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Значит памяти не хватает. Или урезайте осетра (запрашивайте меньше) или обеспечьте необходимое количество памяти для кучи. Как это сделать в keil я не знаю, подозреваю что у вас под кучу вообще памяти в настройках проекта не отводится. Читайте документацию.

В кубе есть параметр Minimum Heap Size. Он установлен на 0x200. В стартапе вижу:

 

Heap_Size      EQU     0x200

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base

 

Да, заработало. Поставил 0x1000. Спутал меня Куб. Думал минимум 0x200, значит можно и больше попросить.

 

Но не нравится такая картина - если ставить EQU 0x200, то ZI-data=5032. Если EQU 0x1000, то ZI-data=8616. Т.е. выделяется примерно 3.5Кб. Получается что выделяется словами?

Изменено пользователем Димон Безпарольный

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но не нравится такая картина - если ставить EQU 0x200, то ZI-data=5032. Если EQU 0x1000, то ZI-data=8616. Т.е. выделяется примерно 3.5Кб. Получается что выделяется словами?

А вы имеете представление о разнице между шестнадцатиричными и десятичными числами?

0x1000-0x200 = 3584 байт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы имеете представление о разнице между шестнадцатиричными и десятичными числами?

0x1000-0x200 = 3584 байт

Да, имею. Заработался. Правильно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...