Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> unhadled exception при вызове free() 
V
    Опции темы
Тутанхамец
Дата 22.1.2006, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: нет
Всего: 6



Господа, прошу помощи. Есть процедура. Не так уж важно, что она делает, но выглядит она так:

Код


int GetNum(){
    int i=0,n=0,exp=0, aexp=0, sigh=1;
    int zc;
    char ipart[32];
    char * mant=(char *)malloc(25*sizeof(char));
    char * sz;
    char * rez;
    double num;
    int startpow;
    memcpy(mant, &setka[8], 24);
    mant[24]=0;

    exp=GetPol(&setka[0], 1,7,6)-64;
    aexp=abs(exp);
    if (aexp>24) zc=aexp-24; else zc=0;
    sz=(char *)malloc((zc+1)*sizeof(char));        
    memset(sz,48,zc);
    sz[zc]=0;
    
    
    if (exp<0)
    {rez=strcat(mant, sz); startpow=aexp-1;}
    else
    {rez=strcat(sz,mant); startpow=-1;}
    
    
    num=GetPol(rez,0,aexp,startpow);

    // до этих строк всё выполняется правильно, но на первом же free возникает ошибка
    free(rez);
    free(sz);
    free(mant);
    
    

return 0;
}


Как только прога доплюхивает до первого free, возникает unhadled exception.... access violation по адресу. Кто-нибудь знает, что я не так делаю? Заранее благодарен.
Добавлено @ 13:54
Чтоб вы все-таки не подумали, что я что-то скрываю smile , то эта процедура вытаскивает вещественное число из массива, который эмулирует 32-разрядную ячейку памяти без обратного и дополнительного кода.
PM MAIL   Вверх
Earnest
Дата 22.1.2006, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Что-то я не увидела кода, который выделяет память указателю rez. А free ты вызываешь...
Может ты думаешь, что strcat память выделяет? Это не так...




--------------------
...
PM   Вверх
Тутанхамец
Дата 22.1.2006, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: нет
Всего: 6



Вообще-то, да. Я думал, что раз уж strcat куда-то склеенное помещает, то она и выделяет сама, и указатель на тот адрес дает.

Попробовал так:

Код

                lrez=strlen(mant)+strlen(sz)+1;
    rez=(char *)malloc(lrez*sizeof(char));
    
    if (exp<0)
    {rez=strcat(mant, sz); startpow=aexp-1;}
        else
    {rez=strcat(sz,mant); startpow=-1;}
    
    
    
    num=GetPol(rez,0,aexp,startpow);
    
    free(rez);
    free(sz);
    free(mant);
    


Картина та же - исключение никуда не девается. Интересно, что так случается не только для rez, а и для двух других указателей.

У меня есть версия, но я в Сях чайник, так что не знаю, насколько она дурацкая.

После "rez=strcat(mant, sz); startpow=aexp-1;"
rez и mant указывают на один блок памяти так? А потом я пытаюсь один и тот же блок освободить два раза? Может, из-за этого?





PM MAIL   Вверх
Тутанхамец
Дата 22.1.2006, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 10.10.2005
Где: в пирамидЕ!

Репутация: нет
Всего: 6



Всё, проблема решена. Оказывается, при вызове strcat, в первой склееваемой строке должно быть место для второй. Первая юзается как буфер. А я думал, сумма строк складывается в какое-то другое место. В общем, всё заработало в таком вот виде:

Код

lrez=strlen(mant)+strlen(sz)+1;
    rez=(char *)malloc(lrez*sizeof(char));
    
    if (exp<0)
    {memcpy(rez,mant,24); memcpy(rez+24,sz,zc); startpow=aexp-1;}
        
        else
    {memcpy(rez,sz,zc); memcpy(rez+zc,mant,24); startpow=-1;}
    
    num=GetPol(rez,0,aexp,startpow);
    
    
    free(sz);
    free(mant);
    free(rez);
    


Earnest, спасибо)

Это сообщение отредактировал(а) Тутанхамец - 22.1.2006, 15:05
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0662 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.