Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> мусор при выделении памяти 
V
    Опции темы
howtoseek
Дата 8.12.2010, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.12.2010

Репутация: нет
Всего: нет



вот простой код
Код

#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 дает тот же эффект.

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

PM MAIL   Вверх
asmdzen
Дата 8.12.2010, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


Профиль
Группа: Участник
Сообщений: 345
Регистрация: 28.11.2010

Репутация: 3
Всего: 5



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

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

PM MAIL   Вверх
howtoseek
Дата 9.12.2010, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 8.12.2010

Репутация: нет
Всего: нет



Спасибо. Помогло. Я и забыл про нольтерминатор совсем.
PM MAIL   Вверх
bsa
Дата 9.12.2010, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




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

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.2350 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.