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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с указателями 
:(
    Опции темы
M9IC
Дата 21.9.2010, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите что не так ? сдыхает на последней строке:
Код

    // Работает
    char * szBuf1 = new char[ 256 ];
    memset( szBuf1, 0, sizeof( szBuf1 ) );
    delete  [] szBuf1;

        
    // 
    CString str2( "И так работает" );
    char * szBuf2 = new char[ str2.GetLength() + 1 ];
    memset( szBuf2, 0, sizeof( szBuf2 ) );
    delete  [] szBuf2;

    // А так не работает, почему ?
    CString str3( "" );
    char * szBuf3 = new char[ str3.GetLength() + 1 ];
    memset( szBuf3, 0, sizeof( szBuf3 ) );
    delete [] szBuf3; // Сдыхает тут

PM MAIL   Вверх
Artemon
Дата 21.9.2010, 14:16 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

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



В твоем коде 2 ошибки:

1. memset( szBuf1, 0, sizeof( szBuf1 ) );
Очистится только первые 2 байта, т.к. sizeof( szBuf1 ) вернет 2.

2. memset( szBuf3, 0, sizeof( szBuf3 ) );
Здесь ты записываешь 2 байта в область памяти размером 1 байт


--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
Estranged
Дата 21.9.2010, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



На практике указатель будет иметь размер 2, 16-разрядной системе (если вы можете найти), 4 на 32-разрядной системе и 8 на 64-разрядной системе. Поэтому memset чистит всегда 2 или 4, или 8 байт. Что в любом случае приводит к Buffer Overflow для третьего случая, где памяти всего 1 байт запрошено. Что и приводит к ошибке, т.к. в отладочной версии есть контроль на подобные вещи для динамической памяти.

Это сообщение отредактировал(а) Estranged - 21.9.2010, 14:32
PM MAIL   Вверх
M9IC
Дата 21.9.2010, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Что-то запутался с sizeof()
Код

    char * szSTROKA = "This is stringgggg";
    char szHello[ 6 ]  = "Hello";
    int SIZE_1 = sizeof( szSTROKA ); // 4
    int SIZE_2 = sizeof( "This is stringgggg" ); // 19
    int SIZE_3 = sizeof( szHello ); // 6


1. Почему в первом варианте возвращается размер 4 ? Получается возвращается размер указателя, а не массива, как тогда узнать размер массива ?
2. Второй вариант, тут все понятно.
3. А вот тут не понятно: почему же здесь мне возвращается 6, т.е. размер массива, а не указателя на массив, хотя в п.1 мне вернули размер указателя ??? 
PM MAIL   Вверх
Crafty
Дата 21.9.2010, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(M9IC @  21.9.2010,  17:11 Найти цитируемый пост)
3. А вот тут не понятно: почему же здесь мне возвращается 6, т.е. размер массива, а не указателя на массив, хотя в п.1 мне вернули размер указателя ??? 


Из стандарта С++
Цитата

5.3.3 Sizeof
...
When applied
to an array, the result is the total number of bytes in the array. This implies that the size of an array of n
elements is n times the size of an element.

PM MAIL   Вверх
Artemon
Дата 21.9.2010, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а ты мне нравишься
***


Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

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



Запомни правило: sizeof может показать размер массива только если массив НЕ динамический.

int m_size = sizeof(array)/sizeof(array[0])





--------------------
Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru
PM MAIL   Вверх
djamshud
Дата 21.9.2010, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



Лучше запомнить другое правило: sizeof работает во время компиляции программы, в рантайме от него проку ноль.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
M9IC
Дата 21.9.2010, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(djamshud @ 21.9.2010,  16:44)
Лучше запомнить другое правило: sizeof работает во время компиляции программы, в рантайме от него проку ноль.

А как тогда узнать размер динамического массива ?

Есть ли другие варианты, кроме как запомнить кол-во элементов и умножить на размер 1ого элемента ?
PM MAIL   Вверх
djamshud
Дата 21.9.2010, 17:17 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

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



M9IC, раз уж вы пишите на С++, используйте vector для динамических массивов. Или запоминайте в какой-нибудь переменной, или впихивайте размер в саму выделенную область памяти. Предложения расположены в порядке увеличения идиотизма:).


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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