malloc не терпит неудачу в Keil C

Как я могу проверить, был ли сбой malloc() в Keil C?

unsigned char xdata malloc_mempool [0x100];
void display()
{
    unsigned char xdata *ptr;
    int a;
    init_mempool (&malloc_mempool, sizeof(malloc_mempool));

    ptr = malloc(9000000);
    if(ptr != 0)
    {
        a = 7;
        free(ptr);
    } else {
        a = 9;
    }
}

Как указано в http://www.keil.com/support/man/docs/c51/c51_malloc.htm malloc вернет нулевой указатель, если памяти недостаточно для удовлетворения запроса на выделение. Очевидно, что в 8051 памяти не так много. Но результат a всегда равен 7.


person mingpepe    schedule 07.06.2016    source источник
comment
9000000 даже не вписывается в int. Я не помню наизусть, что должен делать компилятор в этом случае, но вы можете изменить это значение на значение ‹ 65536. Правильно ли я предполагаю, что int в вашем случае 16-битное?   -  person glglgl    schedule 07.06.2016
comment
@glglgl, malloc() берет unsigned int.   -  person Good Night Nerd Pride    schedule 07.06.2016
comment
Сколько оперативной памяти на самом деле у вашего устройства?   -  person jarmod    schedule 07.06.2016
comment
Из этой таблицы видно, что она определенно меньше 8,5 МБ.   -  person Good Night Nerd Pride    schedule 07.06.2016
comment
Каков размер int на вашей платформе?   -  person Jabberwocky    schedule 07.06.2016
comment
Результат такой же для malloc(9000).(В диапазоне int).   -  person mingpepe    schedule 07.06.2016
comment
@mingpepe А сколько оперативной памяти у вашего устройства?   -  person Jabberwocky    schedule 07.06.2016
comment
Размер ОЗУ @MichaelWalz не должен иметь значения - malloc занимает ровно столько, сколько предусмотрено init_mempool(), поэтому ради этого вопроса 256 байт.   -  person glglgl    schedule 07.06.2016
comment
@mingpepe попробуй: for (;;) { unsigned char xdata *ptr; ptr = malloc(1000); if (ptr == NULL) crash(); }. При этом crash() должен быть вызван в какой-то момент.   -  person Jabberwocky    schedule 07.06.2016
comment
Может есть минимальный размер мемпула. 256 байт действительно очень мало.   -  person Jabberwocky    schedule 07.06.2016
comment
@Abbondanza Поскольку unsigned int и int имеют одинаковые размеры, система с 16-битным int также имеет 16-битный unsigned int, где ограничение составляет 65535.   -  person glglgl    schedule 07.06.2016
comment
@MichaelWalz sizeof(int) = 2 и RAM=512 байт, но это, кажется, не имеет значения. И код не выполняет сбой()   -  person mingpepe    schedule 07.06.2016
comment
@mingpepe посмотрите исходный код malloc. Кстати, имеет ли смысл динамическое выделение памяти в системе с 512 байтами ОЗУ?   -  person Jabberwocky    schedule 07.06.2016
comment
@mingpepe Вы можете попробовать отобразить значение ptr, чтобы понять, почему оно не работает.   -  person glglgl    schedule 07.06.2016
comment
@mingpepe, почему в вашем примере кода все еще есть 9000000? Обновите его, чтобы он был минимальным, полным и поддающимся проверке примером. Что именно возвращается в ptr? Что происходит, когда вы пытаетесь прочитать или записать в память, которую malloc() якобы выделил?   -  person Good Night Nerd Pride    schedule 07.06.2016
comment
Но результат a всегда равен 7. --› Возможно, поскольку код ничего не делает с a, a оптимизируется. Утверждение ОП о том, что a равно 7, основано на чтении a в неустановленном методе. Создайте реальный код, который печатает значение a. и значение ptr.   -  person chux - Reinstate Monica    schedule 07.06.2016


Ответы (1)


Из Понимание организации памяти микроконтроллера 8051 8051 имеет максимум 64 КБ памяти.

Таким образом, он будет использовать 2 байта для указателей. Десятичное число 9000000 — это 0x895440 в шестнадцатеричном формате, что составляет 3 байта.

Очень вероятно, что функция malloc() просто проигнорирует биты, которые она не может использовать, поэтому на самом деле вызов, который вы делаете,

ptr = malloc(0x5440);

который

ptr = malloc(21568);
person Community    schedule 07.06.2016
comment
Вероятно, правильно, но это все еще не объясняет, почему это не работает с malloc(9000) (см. комментарии). - person Jabberwocky; 07.06.2016
comment
Э, да, это так. В вопросе говорится, что результат a всегда равен 7. Это означает, что malloc успешно выделил память. Если вы получите тот же результат с malloc(9000), что и ожидалось. - person ; 07.06.2016
comment
@buffjape С пулом malloc из 256 байт я бы этого вообще не ожидал. - person glglgl; 07.06.2016
comment
OP не должен ожидать, что другие соберут недостающие фрагменты из некоторых комментариев, а вместо этого опубликует минимальный, полный и поддающийся проверке пример. - person Good Night Nerd Pride; 07.06.2016