Правильное использование массива символов в vС++

Я пытаюсь преобразовать 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 выдает исключение нарушения прав доступа.

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


person lostInTransit    schedule 07.02.2009    source источник


Ответы (1)


Во-первых, будьте осторожны со строковыми литералами. Строковые литералы, такие как "", относятся к типу 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

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

person Anteru    schedule 07.02.2009