jurhas Ответов: 3

Ошибки функции Memcmp


Я сомневаюсь в функции memcmp. Предположим, что у нас есть структура, требующая выравнивания:
структура exmp{
обуглить,
char b}

Вероятно, sizeof(exmp) будет равен 4. На самом деле используются два укуса, и для выравнивания требуется два укуса.
Поэтому, когда я вызываю memcmp(exmpptr1, exmpptr2, sizeof(exmp)), эта функция будет сравнивать также два укуса, необходимые для выравнивания.
Будет ли это ошибочным ответом в общем сравнении, или стандарт требует, чтобы неиспользуемые укусы должны быть установлены в какое-то значение? Значит, это надежный и переносимый код?

Что я уже пробовал:

Он не повторяется и является дипендентом платформы.

Richard MacCutchan

memcmp есть ли только какая-либо польза для сравнения массивов byТЭС. Любая другая структура, класс и т. д., Скорее всего, даст неправильные результаты, по крайней мере, некоторое время, поэтому на них нельзя полагаться.

3 Ответов

Рейтинг:
23

OriginalGriff

Это будет проблемой: неиспользуемые байты не должны быть установлены в какое-либо конкретное значение (и оно может отличаться между режимами отладки и выпуска, а не только от системы к системе, поскольку отладочный код часто содержит "контрольные значения", чтобы убедиться, что вы не превышаете лимиты).

Вы должны быть очень, очень осторожны, когда начинаете сравнивать что-либо, приводя его к "неправильному" типу: это может дать вам очень странные результаты. Например, некоторые системы хранят целые числа как наименее значимые первые, некоторые как наиболее значимые первые (малый или большой конец), поэтому сравнение даже 16-битного целого числа с 32-битным целым числом в качестве беззнаковых указателей символов может дать неправильные результаты.


Рейтинг:
0

CPallini

Цитата:
Будет ли это ошибочным ответом в общем сравнении, или стандарт требует, чтобы неиспользуемые укусы должны быть установлены в какое-то значение? Значит, это надежный и переносимый код?
Пока это не так memcmp ошибка, она может дать неожиданные результаты, потому что стандарт не требует (насколько я знаю) определенного значения для байтов заполнения.


Рейтинг:
0

Jochen Arndt

Если вы хотите сравнить структуры C с помощью memcmp вы должны просто убедиться, что структуры не содержат байтов заполнения. Как это сделать, зависит от используемого компилятора.

С использованием компилятора Microsoft упаковка[^]:

#pragma pack(push, 1)
struct exmp {
    char a;
    char b;
};
#pragma pack(pop)

С помощью GCC используйте packed атрибут (см. Общие атрибуты типа-использование коллекции компиляторов GNU (GCC)[^]):
struct __attribute__ ((__packed__)) exmp {
    char a;
    char b;
};