memset в статически выделенном массиве байтов zlib в библиотеке приводит к сбою программы Objective-C++

Я пишу библиотеку, которая использует статически размещенный C-массив типа Byte, определенный в zlib.h. Я обнаружил, что код дает сбой при вызове memset. Полный код выглядит так:

Byte compressedDataBuffer[kLabelBufSiz]; 
memset (compressedDataBuffer, 0, (kLabelBufSiz * sizeof(Byte)));

Я попытался предварительно вычислить значение kLabelBufSiz * sizeof(Byte) и использовать числовое значение для memset, но это не имело никакого значения. Это однопоточная программа и между двумя вызовами нет кода, поэтому я знаю, что память и указатель не меняются. Я подтвердил, что sizeof(Byte) равен 1. Я попытался изменить тип массива на char, и это остановило сбой, поэтому кажется, что тип Byte может играть здесь роль.

Я написал небольшую программу, которая вызывает эту библиотечную функцию, и она не дает сбоев. Программа без сбоев — это чистый C++, тогда как сбойная программа — это Objective-C++. Я создаю их оба на Mac OSX 10.6.7, с gcc-4.2 и XCode. Есть ли что-то в ObjC++, что может вызвать здесь проблемы? У меня никогда раньше не было проблем с библиотеками C++, вызываемыми из ObjC++, но это не значит, что их не существует. Любая помощь приветствуется!


person David    schedule 21.07.2011    source источник


Ответы (1)


Byte — это класс-оболочка. используйте char вместо byte. если вам не нужно использовать Byte, в этом случае не используйте memset

person marinara    schedule 21.07.2011
comment
К сожалению, мне приходится использовать Byte. Есть ли лучший способ обнулить массив, чем memset? - person David; 21.07.2011
comment
вы можете использовать цикл for. memset действительно используется только для больших блоков памяти, где он быстрее, чем цикл for - person marinara; 22.07.2011
comment
Это хорошая идея! Кстати, я попытался поставить байт на последнее место в массиве, и это сработало (compressedDataBuffer[kLabelBufSiz-1] = (Byte)1;). Я не уверен, почему memset вызывает проблемы. - person David; 22.07.2011
comment
Я попробовал цикл for, и он исправляет сбой. Цикл требует около 130 000 итераций, к сожалению, но, по крайней мере, он работает. Хотел бы я знать, почему memset терпит неудачу. - person David; 22.07.2011