*(&data +i ): data у вас имеет тип int16. &data имеет тип "указатель на int16" &data + i указывает на i-й int16 после data. А вы хотите адресоваться к байтам. Поэтому надо было писать *((int8)&data + i) = read_eeprom(i + n); или ((int8)&data)[i] = read_eeprom(i + n); или data = read_eeprom(n) | ((int16)read_eeprom(n + 1) << 8);