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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатель после выхода из функции значение NULL, принимает 
V
    Опции темы
Anarki
Дата 21.12.2007, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 14.3.2005

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



Вообщем столкнулся с такой проблемой, в теле функции память нормально выделяется, cCipher указывает на эту память.
После того как произошел возврат из функции, то cCipher стал указывать на NULL.
Проблема врядли в idea.cpp, т.к. я до этого работал с почти тем же кодом, только без функций.
Это может быть от того, что calloc действует локально? и когда функция завершается, где он работает, то память возвращается обратно и указатель ставится в NULL?
Или где-то я ступил в другом месте? Нужно чтобы cCipher указывал на выделенную память, заполненную новыми значениями.

Код

#include <math.h>
#include <iostream>
#include <iomanip>
#include <string>
#include <stdlib>
using namespace std;
#include "idea.h"

// принимает строку в 1м параметре
// пароль 2й
// возвращает шифр в 3м и его длину в 3
void algoCrypt(string,const byte *,byte *,size_t &);

int main(int argc, char* argv[])
{
    byte cPassword[Idea_userKeySize];
    string sMessage;
    byte *cCipher = 0, *cText = 0;
    size_t len_c, len_t;
    
    cout << "Сгенерированный ключ: ";
    for (int i=0;i<sizeof cPassword;i++) {
        cPassword[i] = rand() % 255;
        cout << setiosflags(ios::showbase) << hex << (int)cPassword[i];
    }
    cout << endl << "Введите строку для шифрования" << endl;
    cin >> sMessage;
    
    algoCrypt(sMessage,cPassword,cCipher,len_c);
    cout << "Зашифрованный текст" << endl;
    for (unsigned int i=0;i<len_c;i++) {
        cout << setiosflags(ios::showbase) << hex << cCipher[i] << ' ';
    }
}

void algoCrypt(string sMessage,const byte *cPassword,byte *cCipher,size_t &len_c) {
    byte *cBuffer = 0; // динамический буффер
    byte bBlock[Idea_dataSize] = {0}; // блок для кодирования
    Idea_Key ideaKey;
    int nBytesRead = 0;
    size_t len_t = 0; // длина строки в символах
    len_c = 0; // фактическая длина шифра или буфера, должна быть кратна Idea_dataSize

    // Calculate the IDEA key from the 16 bytes hash key
    Idea_ExpandUserKey((word16 *)cPassword, ideaKey);
    // выделяем память для буффера
    len_t = sMessage.length();
    // выравнивание до Idea_dataSize
    if ((len_t != 0) && (len_t % Idea_dataSize != 0)) {
        len_c = Idea_dataSize * ceil((float)len_t / Idea_dataSize);
    } else {
        len_c = len_t;
    }
    cBuffer = (byte *) calloc(len_c,sizeof(char));
    cCipher = (byte *) calloc(len_c,sizeof(char));
    // копируем char массив из stl::string без \0

    memcpy(cBuffer, sMessage.c_str(),len_t);
    unsigned int i = 0;
    while (i<len_t) {
        if (i+Idea_dataSize >= len_t) {
            nBytesRead = abs((int)(len_t-i));
        } else {
            nBytesRead = Idea_dataSize;
        }
        memcpy(bBlock, cBuffer+i, (nBytesRead < Idea_dataSize) ? nBytesRead : Idea_dataSize);
        if (nBytesRead < Idea_dataSize) {
            memset(bBlock + nBytesRead, 0, Idea_dataSize-nBytesRead);
        }
        // шифрование
        Idea_Crypt((word16 *)bBlock, (word16 *)bBlock, ideaKey);
        // выходной шифр
        memcpy(cCipher+i,bBlock,Idea_dataSize);
        i = i+Idea_dataSize;
    }

    // освобождаем память
    realloc(cBuffer,0); 
}



--------------------
PM WWW   Вверх
dumb
Дата 21.12.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

Репутация: 3
Всего: 158



в функцию передается значение указателя. а нужно - ссылку(ну или указатель) на указатель. вобщем почитай про передачу параметров повнимательней.

Код
void algoCrypt(char *sMessage,const byte *cPassword,byte* &cCipher,size_t &len_c)

но лучше выделять память не внутри функции, а снаружи и передавать в функцию обычные указатели на буфера...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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