|
|
  |
Почему может не работать malloc в Keil?, STM32L151 |
|
|
|
Sep 12 2017, 20:57
|
Знающий
   
Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247

|
Делаю для 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);
Сообщение отредактировал Димон Безпарольный - Sep 12 2017, 20:58
|
|
|
|
|
Sep 13 2017, 05:56
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (Димон Безпарольный @ Sep 12 2017, 23:57)  CODE char *SprintFBUF = NULL; SprintFBUF = (char*) malloc(400); Печатает кракозябры. Что может быть не так? malloc может вернуть NULL, если не смог найти кусок памяти нужного вам размера. Вы проверяете SprintFBUF на NULL после malloc?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Sep 13 2017, 06:02
|
Знающий
   
Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450

|
Цитата(Димон Безпарольный @ Sep 13 2017, 00:57)  Делаю для 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);
|
|
|
|
|
Sep 13 2017, 06:13
|
Знающий
   
Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247

|
Цитата(Сергей Борщ @ Sep 13 2017, 09:56)  malloc может вернуть NULL, если не смог найти кусок памяти нужного вам размера. Вы проверяете SprintFBUF на NULL после malloc? Да, теперь проверяю. Так и происходит. Почему не выделяет - теперь основной вопрос. Код if(SprintFBUF == NULL) {printf("\rNo Memory\r");} Цитата(novikovfb @ Sep 13 2017, 10:02)  а что должен печатать? Выделение памяти по malloc никак не должно инициализировать содержимое этой памяти. Попробуйте вместо printf("\n%s\n", p); сделать printf("\n%s\n%s\n", p,mBUF); Этот кусок кода просто не показан. Конечно я печатаю в эту область sprintf'ом.
Сообщение отредактировал Димон Безпарольный - Sep 13 2017, 06:14
|
|
|
|
|
Sep 13 2017, 06:20
|
Знающий
   
Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247

|
Цитата(Сергей Борщ @ Sep 13 2017, 10:15)  Значит памяти не хватает. Или урезайте осетра (запрашивайте меньше) или обеспечьте необходимое количество памяти для кучи. Как это сделать в 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Кб. Получается что выделяется словами?
Сообщение отредактировал Димон Безпарольный - Sep 13 2017, 06:30
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|