Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
креш при копировании в char |

10.04.2009, 17:21
|
|
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме: 1059196
Репутация:
39
|
|
креш при копировании в char
подскажите почему падает программа
PHP код:
char *Text[5];
char *Textre = "Rus";
Text[4] = "";
sprintf( Text[4], "zzz/%s/ggg", Textre );
printf("%s",Text[4] );
Последний раз редактировалось fire64; 10.04.2009 в 17:29..
|
|
|

10.04.2009, 17:40
|
|
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме: 2868783
Репутация:
414
|
|
ты опредиляешь массив указателей, но не выделяешь память под текст
sprintf( Text[4], "zzz/%s/ggg", Textre );
поэтому прога и будет падать. При таком опредилении под каждый указатель отводится 4/8 байта (х86/х86_64).
Юзай malloc() или new[] для выделения памяти.
|
|
|

10.04.2009, 17:42
|
|
Постоянный
Регистрация: 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]);
|
|
|

10.04.2009, 17:58
|
|
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме: 2868783
Репутация:
414
|
|
Нехватает места в Text, при копировании... ну и чуток не верно сам процесс копирования проходит
Бред полнейший
&Text[3] - вот тут ошибка будет, ты адрес адреса получаешь
И куда ты писать собираешься? в рельсу? память не выделена, при запуске сразу ексепшин получишь.
|
|
|

10.04.2009, 18:05
|
|
Постоянный
Регистрация: 04.11.2007
Сообщений: 303
Провел на форуме: 811764
Репутация:
119
|
|
razb, прежде чем сюда постить какой-либо код, я его проверяю.
|
|
|

10.04.2009, 18:16
|
|
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме: 2868783
Репутация:
414
|
|
Незнаю каким макаром оно у тя "работает" но вот нормальный код:
Код:
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);
|
|
|

10.04.2009, 18:38
|
|
Участник форума
Регистрация: 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]);
}
|
|
|

10.04.2009, 19:00
|
|
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме: 2868783
Репутация:
414
|
|
Ну дак выделяй память для каждого элемента массива указателей в цикле и не забудь об освобождении памяти.
|
|
|

10.04.2009, 19:44
|
|
Участник форума
Регистрация: 01.04.2008
Сообщений: 200
Провел на форуме: 1059196
Репутация:
39
|
|
razb , спасибо, работает
а free(buffer); надо делать в конце каждого цикла, или при выходе из цикла ?
|
|
|

10.04.2009, 19:54
|
|
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме: 3288241
Репутация:
3349
|
|
Ну дак выделяй память для каждого элемента массива указателей в цикле и не забудь об освобождении памяти.
Лучше выделить один участок памяти большой, а потом просто рапределить его между элементами макссива. Меньша нагрузки и кода.
Логика примерно такая.
Иногда жаде помогает при переполнении. т.е. не вызываек краха )
Код:
// определяем максимальны размер каждого элемента
#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..
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|