@m_dias

Как работает выделение памяти malloc?

Задача: брать из ввода символы до символа перевода строки, после этого переворачивать слово

Код приведенный ниже, наверняка неверен, но в любом случае не понятно как он работает, выделяется 0 байт нетепизированной памяти из кучи и присваивается указателю на char, но почему-то не получаю ошибку при str[i].

Правильно ли я понимаю, что в str находится начало выделянно памяти на 0 байт типа char, а дальше идет запись символов в память, которая для нас не предназначалась?

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

void print_reverse_array(const char *str, int N)
{
    int i;
    for(i = N - 1; i >= 0; i--){
        printf("%c", str[i]);
    }
    printf("\n");

}


int main()
{
    int c;
    char *str = malloc(0);
    int i = 0;
    while( (c = getchar()) != EOF ){
        if(c == '\n'){
            print_reverse_array(str, i);
            i = 0;
            continue;
        }
        str[i] = c;
        i++;
    }
    free(str);
    str = NULL;

    return 0;
}
  • Вопрос задан
  • 194 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
char *str = malloc(0);
Правильно ли я понимаю, что в str находится начало выделянно памяти на 0 байт


Вот что говорит стандарт (c99, 7.20.3:1) о выделении 0 байт через malloc:

If the size of the space requested is zero, the behavior is implementation-
defined: either a null pointer is returned, or the behavior is as if the size were some
nonzero value, except that the returned pointer shall not be used to access an object.


Поскольку твоё обращение к этой памяти не вызывает SEGFAULT, то да, malloc вернул не NULL. Сколько байт реально было выделено зависит от реализации.

а дальше идет запись символов в память, которая для нас не предназначалась?


Да. Использовать эту память согласно стандарту нельзя.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы