PDA

Просмотр полной версии : креш при копировании в char


fire64
10.04.2009, 17:21
подскажите почему падает программа

char *Text[5];
char *Textre = "Rus";
Text[4] = "";
sprintf( Text[4], "zzz/%s/ggg", Textre );
printf("%s",Text[4] );

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

criz
10.04.2009, 17:42
Нехватает места в Text, при копировании... ну и чуток не верно сам процесс копирования проходит :)

char *Text[5];
char *Textre = "Rus";

Text[3] = "";
sprintf(&Text[3], "zzz/%s/ggg", Textre );
printf("%s", &Text[3]);

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

criz
10.04.2009, 18:05
razb, прежде чем сюда постить какой-либо код, я его проверяю.

razb
10.04.2009, 18:16
Незнаю каким макаром оно у тя "работает" но вот нормальный код:

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);

fire64
10.04.2009, 18:38
Незнаю каким макаром оно у тя "работает" но вот нормальный код:

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]);
}

razb
10.04.2009, 19:00
но мне нужен массив
Ну дак выделяй память для каждого элемента массива указателей в цикле и не забудь об освобождении памяти.

fire64
10.04.2009, 19:44
razb , спасибо, работает

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

slesh
10.04.2009, 19:54
Ну дак выделяй память для каждого элемента массива указателей в цикле и не забудь об освобождении памяти.
Лучше выделить один участок памяти большой, а потом просто рапределить его между элементами макссива. Меньша нагрузки и кода.
Логика примерно такая.
Иногда жаде помогает при переполнении. т.е. не вызываек краха )

// определяем максимальны размер каждого элемента
#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]); // сразу всё убереш за собой