Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > мусор при выделении памяти


Автор: howtoseek 8.12.2010, 10:54
вот простой код
Код

#include <stdio.h>
#include <windows.h>

int main()
{

    const char source[] = "Stroka Stroka Stroka Stroka Stroka";
    
    int count = strlen( source ); // определяем длинну строки

    char * target = (char *) malloc( count ); // выделяем буфер разером с-байт

    strncpy( target, source , count ); // копируем строку в выделенный буфер

    printf( "%s", target ); // печатаем его содердимое

    free( target ); // очищаем

}



Работает он не совсем так, как мне нужно. Проблема при выделении памяти.  
Strlen возвращает длину 34 символа, но при выделении буфера такого размера он оказывается больше на 14 байт.
Ему в конец добавляется какой-то мусор.
При отладке(после выполнения 11-ой строки кода) содержимое памяти, на которую указывает target такое: "ННННННННННННННННННННННННННННННННННээээ««««««««ою".
После выполнения 13-ой строки кода такое: "Stroka Stroka Stroka Stroka Strokaээээ««««««««ою".
 
Использование new и delete дает тот же эффект.

Вопрос: откуда тут берется вот это "ээээ««««««««ою" и в чем мой косяк?

Автор: asmdzen 8.12.2010, 11:33
это не ваша память, strlen( source ) возвращает длину строки в символах без конечного нуля, при копировании как и при выделении памяти вы передаете неправильный параметр, следует сначала прибавить единицу к "count", примерно так:
Код

int count = strlen( source ) + 1; // определяем длинну строки + конечный ноль
char * target = (char *) malloc( count ); // выделяем буфер разером с-байт
strncpy( target, source , count ); // копируем строку в выделенный буфер

Автор: howtoseek 9.12.2010, 08:31
Спасибо. Помогло. Я и забыл про нольтерминатор совсем.

Автор: bsa 9.12.2010, 17:49

M
bsa
howtoseek, если ответ на вопрос получен, то пометь тему решенной

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)