Правильное использование массива char в vc ++ - PullRequest
0 голосов
/ 07 февраля 2009

Я пытаюсь преобразовать IStream в HBITMAP, используя класс GDI + Bitmap. Объект IStream заполняется с использованием данных из веб-службы. Я читаю данные по частям и добавляю их к объекту для последующего использования с классом Bitmap.

Вот соответствующая часть кода

        char data1[] = "";
        int offset = 0;

        LPTSTR pszString = NULL;
        LPSTREAM lpStream = NULL;

        CreateStreamOnHGlobal(NULL, TRUE, &lpStream);
        StreamStringCopy ((LPSTREAM)lpStream, (LPCTSTR)"");
        while(of->pread(&data1,1023,offset) > 0){
            LPCTSTR tempStr = data1;
            StreamStringCat ((LPSTREAM)lpStream, tempStr);
            offset = offset + strlen(data1);    
        }
        Bitmap bm(lpStream,FALSE);
        bm.GetHBITMAP(Color.Black, &ret);

StreamStringCat добавляет строку к объекту LPSTREAM, чтобы я мог получить один объект LPSTREAM.

Цикл работает нормально только в первый раз. Когда цикл while вводится снова, & data1 дает исключение нарушения доступа.

Может кто-нибудь подскажите, пожалуйста, как мне решить эту проблему. Благодаря.

1 Ответ

1 голос
/ 07 февраля 2009

Во-первых, будьте осторожны со строковыми литералами. Строковые литералы типа "" имеют тип const char*, поэтому вы не можете писать в них. Я не совсем уверен, делает ли ваша конструкция char data1[] = "" доступной для записи, но даже если это так, у вас есть только память для 2 символов, в то время как вы (я полагаю) пытаетесь прочитать 1023 байта в расположение data1. Попробуйте это:

char* data1 = static_cast<char*> (std::malloc (1024 * sizeof (char));

...

std::free (data1);

// or try this
char data1 [1024] = { 0 }; // Gives you 1024 bytes to write to on the stack

Это выделяет некоторую память, в которую можно записать. Я думаю, после первого запуска вы перезаписали некоторую память, что приводит к нарушению доступа при следующем запуске.

...