ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

креш при копировании в char
  #1  
Старый 10.04.2009, 17:21
Аватар для fire64
fire64
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме:
1059196

Репутация: 39
По умолчанию креш при копировании в char

подскажите почему падает программа

PHP код:
char *Text[5];
char *Textre "Rus";
Text[4] = "";
sprintfText[4], "zzz/%s/ggg"Textre );
printf("%s",Text[4] ); 

Последний раз редактировалось fire64; 10.04.2009 в 17:29..
 
Ответить с цитированием

  #2  
Старый 10.04.2009, 17:40
Аватар для razb
razb
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме:
2868783

Репутация: 414


Отправить сообщение для razb с помощью ICQ
По умолчанию

Цитата:
char *Text[5];
ты опредиляешь массив указателей, но не выделяешь память под текст
Цитата:
sprintf( Text[4], "zzz/%s/ggg", Textre );
поэтому прога и будет падать. При таком опредилении под каждый указатель отводится 4/8 байта (х86/х86_64).
Юзай malloc() или new[] для выделения памяти.
 
Ответить с цитированием

  #3  
Старый 10.04.2009, 17:42
Аватар для criz
criz
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
Провел на форуме:
811764

Репутация: 119
По умолчанию

Нехватает места в Text, при копировании... ну и чуток не верно сам процесс копирования проходит
Код:
	 char *Text[5];
        char *Textre = "Rus";
 
	Text[3] = "";
        sprintf(&Text[3], "zzz/%s/ggg", Textre );
        printf("%s",	&Text[3]);
 
Ответить с цитированием

  #4  
Старый 10.04.2009, 17:58
Аватар для razb
razb
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме:
2868783

Репутация: 414


Отправить сообщение для razb с помощью ICQ
По умолчанию

Цитата:
Нехватает места в Text, при копировании... ну и чуток не верно сам процесс копирования проходит
Бред полнейший
&Text[3] - вот тут ошибка будет, ты адрес адреса получаешь
И куда ты писать собираешься? в рельсу? память не выделена, при запуске сразу ексепшин получишь.
 
Ответить с цитированием

  #5  
Старый 10.04.2009, 18:05
Аватар для criz
criz
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
Провел на форуме:
811764

Репутация: 119
По умолчанию

razb, прежде чем сюда постить какой-либо код, я его проверяю.
 
Ответить с цитированием

  #6  
Старый 10.04.2009, 18:16
Аватар для razb
razb
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме:
2868783

Репутация: 414


Отправить сообщение для razb с помощью ICQ
По умолчанию

Незнаю каким макаром оно у тя "работает" но вот нормальный код:
Код:
char* buffer = (char *)malloc(100 * sizeof(char));
char text[] = "Hello world";

      memset(buffer, '\0', 100 * sizeof(char));
      sprintf(buffer, "%s", text);
      printf("%s\n", buffer);
      free(buffer);
 
Ответить с цитированием

  #7  
Старый 10.04.2009, 18:38
Аватар для fire64
fire64
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме:
1059196

Репутация: 39
По умолчанию

Цитата:
Сообщение от razb  
Незнаю каким макаром оно у тя "работает" но вот нормальный код:
Код:
char* buffer = (char *)malloc(100 * sizeof(char));
char text[] = "Hello world";

      memset(buffer, '\0', 100 * sizeof(char));
      sprintf(buffer, "%s", text);
      printf("%s\n", buffer);
      free(buffer);
это конечно хорошо, но мне нужен массив
что бы получать значения для каждого индекса

for( int index = 0; index < 4; ++index )
{
printf("%s", Text[index]);
}
 
Ответить с цитированием

  #8  
Старый 10.04.2009, 19:00
Аватар для razb
razb
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме:
2868783

Репутация: 414


Отправить сообщение для razb с помощью ICQ
По умолчанию

Цитата:
но мне нужен массив
Ну дак выделяй память для каждого элемента массива указателей в цикле и не забудь об освобождении памяти.
 
Ответить с цитированием

  #9  
Старый 10.04.2009, 19:44
Аватар для fire64
fire64
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме:
1059196

Репутация: 39
По умолчанию

razb , спасибо, работает

а free(buffer); надо делать в конце каждого цикла, или при выходе из цикла ?
 
Ответить с цитированием

  #10  
Старый 10.04.2009, 19:54
Аватар для slesh
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

Цитата:
Ну дак выделяй память для каждого элемента массива указателей в цикле и не забудь об освобождении памяти.
Лучше выделить один участок памяти большой, а потом просто рапределить его между элементами макссива. Меньша нагрузки и кода.
Логика примерно такая.
Иногда жаде помогает при переполнении. т.е. не вызываек краха )
Код:
// определяем максимальны размер каждого элемента
#define size 256
// кол-во элементов
#define cnt 5
char *Text[cnt];
char *Textre = "Rus";
Text[0] =malloc(cnt*size);
for (int i=1;i<cnt;i++) Text[i]=(char*)((ULONG)Text[0]+i*size);
....
что нужно делаешь
...
free(Text[0]); // сразу всё убереш за собой

Последний раз редактировалось slesh; 10.04.2009 в 19:59..
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват Gsm пакетов SNIFF Сотовый фрикинг 16 27.12.2009 22:25
Кодинг(брут) ...ъХ... PHP, PERL, MySQL, JavaScript 12 11.04.2006 02:10
Компиляторы Dimann С/С++, C#, Delphi, .NET, Asm 34 20.03.2006 21:23
софт для удаленного сервера _lolik_ Уязвимости 6 05.02.2006 10:58



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ