Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.11.2011, 05:19   #1
goluzov
Форумчанин
 
Регистрация: 26.06.2010
Сообщений: 168
По умолчанию переполнение буфера

имеется две переменые

char buffer_one[8]
char buffer_two[8]

адреса их такие

0xbffff7f0
0xbffff7f8

записываем в buffer_one 12345678

выводим printf buffer_one, выводит 12345678. НО как она функция printf находит конец строки? нулевой байт? но тогда нулевой байт будет находится во второй переменной
goluzov вне форума Ответить с цитированием
Старый 27.11.2011, 06:39   #2
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от goluzov Посмотреть сообщение
имеется две переменые

char buffer_one[8]
char buffer_two[8]

адреса их такие

0xbffff7f0
0xbffff7f8

записываем в buffer_one 12345678

выводим printf buffer_one, выводит 12345678. НО как она функция printf находит конец строки? нулевой байт? но тогда нулевой байт будет находится во второй переменной
если вы объявили эти массива в глобальном пространстве имен, то массивы инициализируются нулем. Поэтому нет ничего удивительного, что ваш первый массив вывелся на печать корректно, так как второй массив, являющийся продолжением первого массива, содержит одни нули. Ежели эти массивы не определены в глобальном пространстве имен, а являются локальными для функции, то считайте, что вам просто повезло!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 27.11.2011, 08:11   #3
goluzov
Форумчанин
 
Регистрация: 26.06.2010
Сообщений: 168
По умолчанию

получается что если выделить 8 байт и записать 8 байт..... то на самом деле записывается 9 байт? 9-ый байт - нулл байт...
goluzov вне форума Ответить с цитированием
Старый 27.11.2011, 08:32   #4
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от goluzov Посмотреть сообщение
получается что если выделить 8 байт и записать 8 байт..... то на самом деле записывается 9 байт? 9-ый байт - нулл байт...
Из моего ответа это не слеудет. Это ваши фантазии. Перечитайте мой предыдущий ответ еще раз. Там все ясно сказано.
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 27.11.2011, 09:02   #5
goluzov
Форумчанин
 
Регистрация: 26.06.2010
Сообщений: 168
По умолчанию

это локальные

в след адресе было значение 123

после записи 8 байт. 9 байт нулл байт, записался в след переменую. и там стало не 123 а 0x00 23

Последний раз редактировалось Stilet; 27.11.2011 в 12:18.
goluzov вне форума Ответить с цитированием
Старый 27.11.2011, 10:00   #6
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от goluzov Посмотреть сообщение
в след адресе было значение 123

после записи 8 байт. 9 байт нулл байт, записался в след переменую. и там стало не 123 а 0x00 23
Еще раз повторяю: не фантазируйте! При записи 8 байт может записаться только 8 байт! Значит вы просто делаете то, что сами не понимаете!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 27.11.2011, 10:10   #7
goluzov
Форумчанин
 
Регистрация: 26.06.2010
Сообщений: 168
По умолчанию

Код:
#include <string.h>
#include <stdio.h>

int main( void )
{
  char string[8];
  char string2[8];

   strcpy( string, "123" );
   strcpy( string2, "12345678" );

   printf( "%s    ,  %s \n", string2, string );
   
   while(1) {}
}

Последний раз редактировалось Stilet; 27.11.2011 в 12:18.
goluzov вне форума Ответить с цитированием
Старый 27.11.2011, 10:13   #8
Сыроежка
Форумчанин
 
Регистрация: 01.07.2011
Сообщений: 423
По умолчанию

Цитата:
Сообщение от goluzov Посмотреть сообщение
#include <string.h>
#include <stdio.h>

int main( void )
{
char string[8];
char string2[8];

strcpy( string, "123" );
strcpy( string2, "12345678" );

printf( "%s , %s \n", string2, string );

while(1) {}
}
Ну, и ткните пальцем, где вы записываете 8 байт?!!! Очень любопытно!
Со мной можно встретиться на www.clipper.borda.ru
Сыроежка вне форума Ответить с цитированием
Старый 27.11.2011, 11:30   #9
goluzov
Форумчанин
 
Регистрация: 26.06.2010
Сообщений: 168
По умолчанию

strcpy( string2, "12345678" );
goluzov вне форума Ответить с цитированием
Старый 27.11.2011, 12:35   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Переполнения не будет. Все потому что строки хранятся не в стеке, а в динамической памяти (имею ввиду их тела). И резервируется под них на один байт больше. Вот смотри в отладчике - там нулевой символ всетки дописывается самим компилятором
Изображения
Тип файла: jpg Безымянный.JPG (225.8 Кб, 126 просмотров)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как подменить адрес возврата функции func на адрес функции f используя переполнение буфера buf и функции gets dmitrii6120 Помощь студентам 6 14.11.2011 20:10
переполнение буфера Dimarik Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.07.2011 02:24
Арифметическое переполнение hasana Помощь студентам 2 04.11.2010 18:08
Переполнение деления!!! zero-cool Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 28.09.2010 21:10
Переполнение Стека Викдон Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2008 19:16