Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   креш при копировании в char (https://forum.antichat.xyz/showthread.php?t=115274)

fire64 10.04.2009 17:21

креш при копировании в char
 
подскажите почему падает программа

PHP код:

char *Text[5];
char *Textre "Rus";
Text[4] = "";
sprintfText[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

Цитата:

Сообщение от 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]);
}

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]); // сразу всё убереш за собой



Время: 13:00