@lutokris

Почему выделение памяти под строку выглядит не по шаблону?

Всем добра. Учу С++ по Шилдту. Почти в самом начале дошел до динамического выделения памяти и уже всерьез озадачился следующим. Ведь исходя из синтаксиса выделения памяти - (T *) malloc(n * sizeof(T)); то мы вроде должны написать
(char*) malloc (len * sizeof(char)); А почему то пишут (char*) malloc (len + 1); тем самым вроде выделяя память лишь для символа '10'. В общем, я в непонятках почему так пишут, ведь когда выделяют для динамического массива int то пишут (int*) malloc(n * sizeof(int);

а это пример с книги

strtype::strtype(char *ptr) {
     len = strlen(ptr);   
     p = (char*) malloc(len + 1);
     if (!p) 
     {
            cout << "Ошибка выделения памяти" << endl;
            exit; 
     }
     strcpy(p, ptr);
}
  • Вопрос задан
  • 80 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Когда вы выделяете массив на n элементов типа T вам надо n*sizeof(T) памяти.

Когда вы выделяете строку на n символов вам надо n+1 байт памяти. Потому что каждый символ занимает 1 байт, и вам нужно место под n символов и под завершающий символ '\0'. В C/C++ строки всегда завершаются нулевым символом. Надо про него всегда помнить и выделять под него место.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@lutokris Автор вопроса
Вроде понял почему, в качестве параметра malloc принимает размер выделяемой области в байтах, соответственно так как размер символа char - 1 байт, мы можем в качестве размера выделяемой памяти передать длину строки. А int - 4 байта, поэтому нужно выделить размер n * sizeof(int) и допустим 10 целочисленных чисел займут 40 байт места. Правда еще не до конца совсем понятно почему в примере выделили размер памяти под строку Length + 1, а не просто Length строки. Получается например под строку длиной 10 символов - "новальживи" мы выделим на 10 байт, а 11 байт.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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