креш при копировании в char

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by fire64, 10 Apr 2009.

  1. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    подскажите почему падает программа

    PHP:
    char *Text[5];
    char *Textre "Rus";
    Text[4] = "";
    sprintfText[4], "zzz/%s/ggg"Textre );
    printf("%s",Text[4] );
     
    #1 fire64, 10 Apr 2009
    Last edited: 10 Apr 2009
  2. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    ты опредиляешь массив указателей, но не выделяешь память под текст
    поэтому прога и будет падать. При таком опредилении под каждый указатель отводится 4/8 байта (х86/х86_64).
    Юзай malloc() или new[] для выделения памяти.
     
  3. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    Нехватает места в Text, при копировании... ну и чуток не верно сам процесс копирования проходит :)
    Code:
    	 char *Text[5];
            char *Textre = "Rus";
     
    	Text[3] = "";
            sprintf(&Text[3], "zzz/%s/ggg", Textre );
            printf("%s",	&Text[3]);
    
     
  4. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Бред полнейший
    &Text[3] - вот тут ошибка будет, ты адрес адреса получаешь
    И куда ты писать собираешься? в рельсу? память не выделена, при запуске сразу ексепшин получишь.
     
  5. criz

    criz Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    293
    Likes Received:
    40
    Reputations:
    6
    razb, прежде чем сюда постить какой-либо код, я его проверяю.
     
    1 person likes this.
  6. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Незнаю каким макаром оно у тя "работает" но вот нормальный код:
    Code:
    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);
    
     
    1 person likes this.
  7. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    это конечно хорошо, но мне нужен массив
    что бы получать значения для каждого индекса

    for( int index = 0; index < 4; ++index )
    {
    printf("%s", Text[index]);
    }
     
  8. razb

    razb Active Member

    Joined:
    24 Mar 2009
    Messages:
    658
    Likes Received:
    133
    Reputations:
    18
    Ну дак выделяй память для каждого элемента массива указателей в цикле и не забудь об освобождении памяти.
     
  9. fire64

    fire64 Elder - Старейшина

    Joined:
    1 Apr 2008
    Messages:
    251
    Likes Received:
    22
    Reputations:
    5
    razb , спасибо, работает

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

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Лучше выделить один участок памяти большой, а потом просто рапределить его между элементами макссива. Меньша нагрузки и кода.
    Логика примерно такая.
    Иногда жаде помогает при переполнении. т.е. не вызываек краха )
    Code:
    // определяем максимальны размер каждого элемента
    #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]); // сразу всё убереш за собой
    
     
    #10 slesh, 10 Apr 2009
    Last edited: 10 Apr 2009
    1 person likes this.