Димон Безпарольный 2 12 сентября, 2017 Опубликовано 12 сентября, 2017 (изменено) · Жалоба Делаю для 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); Изменено 12 сентября, 2017 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AVI-crak 0 12 сентября, 2017 Опубликовано 12 сентября, 2017 · Жалоба А что произойдёт с адресом выделенной памяти после вторичного вызова функции? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 13 сентября, 2017 Опубликовано 13 сентября, 2017 · Жалоба Печатает кракозябры. Что может быть не так? Проверяйте стек, вернее его переполнение, наползание кучи на стек и т.п. Вы же можете в отладчике посмотреть адреса, или вывести их в консольку? Можно ОЗУ заполнить каким-либо паттерном, чтобы определить что что портит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 13 сентября, 2017 Опубликовано 13 сентября, 2017 · Жалоба char *SprintFBUF = NULL; SprintFBUF = (char*) malloc(400); Печатает кракозябры. Что может быть не так? malloc может вернуть NULL, если не смог найти кусок памяти нужного вам размера. Вы проверяете SprintFBUF на NULL после malloc? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 13 сентября, 2017 Опубликовано 13 сентября, 2017 · Жалоба Делаю для 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); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 13 сентября, 2017 Опубликовано 13 сентября, 2017 (изменено) · Жалоба 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'ом. Изменено 13 сентября, 2017 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 123 13 сентября, 2017 Опубликовано 13 сентября, 2017 · Жалоба Да, теперь проверяю. Так и происходит.Значит памяти не хватает. Или урезайте осетра (запрашивайте меньше) или обеспечьте необходимое количество памяти для кучи. Как это сделать в keil я не знаю, подозреваю что у вас под кучу вообще памяти в настройках проекта не отводится. Читайте документацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 13 сентября, 2017 Опубликовано 13 сентября, 2017 (изменено) · Жалоба Значит памяти не хватает. Или урезайте осетра (запрашивайте меньше) или обеспечьте необходимое количество памяти для кучи. Как это сделать в 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Кб. Получается что выделяется словами? Изменено 13 сентября, 2017 пользователем Димон Безпарольный Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 68 13 сентября, 2017 Опубликовано 13 сентября, 2017 · Жалоба Но не нравится такая картина - если ставить EQU 0x200, то ZI-data=5032. Если EQU 0x1000, то ZI-data=8616. Т.е. выделяется примерно 3.5Кб. Получается что выделяется словами? А вы имеете представление о разнице между шестнадцатиричными и десятичными числами? 0x1000-0x200 = 3584 байт Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Димон Безпарольный 2 13 сентября, 2017 Опубликовано 13 сентября, 2017 · Жалоба А вы имеете представление о разнице между шестнадцатиричными и десятичными числами? 0x1000-0x200 = 3584 байт Да, имею. Заработался. Правильно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться