Возможно, что если я получу доступ к карте памяти файла через указатель типа структуры с дырой, он может не сопоставить элементы структуры с корректными данными. Например,
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
typedef union{
int a;
char c[4];
}INT;
typedef struct{
char type;
INT data;
}RECORD;
int main(){
int fd;
RECORD *recPtr;
fd = open("./f1", O_RDWR);
if (fd == -1){
printf("Open Failed!\n");
}
printf("Size of RECORD: %d\n", sizeof(RECORD));
recPtr = (RECORD *)mmap(0, 2*sizeof(RECORD), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (recPtr == MAP_FAILED){
printf("Map Filaed!\n");
}
printf("type: %c, data: %c%c%c%c\n", recPtr->type, recPtr->data.c[0], recPtr->data.c[1], recPtr->data.c[2], recPtr->data.c[3]);
}
Если файл "f1" содержит следующие данные:
012345678
Вышеуказанные программы выдают результат как
Size of RECORD: 8
type: 0, data: 4567
, поскольку символы 123 съедены отверстиями структуры.
Есть ли способ избежать этого без использования директивы pragma pack и без изменения порядка элементов в структуре.