На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> realloc????
    Не выполняется перераспределение памяти :-((
    Есть код:

    Сначала заполняется массив arTxt. Необходимо его заполнять с помощью malloc, realloc и strcpy.

    char **arTxt;
    arTxt= new char *[cntRows]; // любое , например 3
    int row=0, i=0;
    arTxt[0]=(char*)malloc(1);
    strcpy(arTxt[0],"");
    printf ("\n ______Введите текст______\n");
    while (1)
    {
    unsigned char sm;
    cscanf("%c",&sm);
    if (sm==13)
    {
    printf("\n");
    row++;
    i=0;
    if (row==cntRows) break;
    else
    {
    arTxt[row]=(char*)malloc(1);
    strcpy(arTxt[row],"");
    }
    } else
    {
    arTxt[row]=(char*)realloc(arTxt[row], i+1);
    char *newS=" ";
    newS[0]=sm;
    strcpy( &arTxt[row][i], newS);
    i++;
    }
    }
    Потом в конец каждого arTxt[row] добавить некоторую строку entrWrd
    for (i=0; i<cntRows; i++)
    {
    int len1=strlen(arTxt[i]),
    len2=strlen(entrWrd);
    arTxt[i]=(char*)realloc(arTxt[i], len1+len2); //!!! На этой строке программа виснет глухо в 90% случаев.
    strcat(arTxt[i], entrWrd);
    }

    Может быть распределение памяти делаю не так???
    Помогите.
      До конца прогу не разбирал, но вот здесь у тебя глюк:
      char *newS=" ";
      newS[0]=sm;

      У тебя получается, что newS - строка-константа. И присваивание следующей строкой не сработает. Странно, что тебе компилятор за это по шапке не дал.
      В общем, правь на char newS[10] = {' ', 0};

      На будущее - куски кода, тем более такие большие, рекомендуется обрамлять тегами [ CODE ] здесь код [ /CODE ] (пробелы убрать, большие буквы обязательно).
        Эту строку надо вот так:
        arTxt[row]=(char*)realloc(&arTxt[row], (i+1)*sizeof(char));

        потом, как было уже замечено, надо сделать
        newS = new char;

        Здесь ты просто пишешь строку newS в невыделенный кусок памяти. Ты же еще не выделил память под
        arTxt[row][i]:
        strcpy( &arTxt[row][i], newS); - это вот сдесь - пишешь туда, не понятно куда

        Ну и все. Когда доходит до твоего места, где все виснет и вылетает, то и размер строки не может узнать int len1=strlen(arTxt[i]),...
        и перераспределить память не может, т.к. надо вот так
        arTxt[i]=(char*)realloc(&arTxt[i], len1+len2)

        Напиши правильный небольшой код. На нем "научись" работать с выделением память, а потом пиши такой, что бы ошибок было по меньше.
          А еще лучше потрать немного времени на изучение STL.
          В частности на работу с векторами.
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0234 ]   [ 16 queries used ]   [ Generated: 3.05.24, 17:14 GMT ]