sizeof
возвращает размер массива в байтах, если массив передан, например:
int MY_LUT[101];
printf("%d", sizeof(MY_LUT)); //prints 101 * sizeof(int)
Если вы передаете указатель на структуру, содержащую массив, то для полученияполный размер структуры вы бы разыменовали его:
#define EZBL_WriteROMObj(destPgmAddr, srcRAMObjPtr)\
{\
printf("%d", sizeof(*srcRAMObjPtr));\
}
...
struct
{
int MY_LUT[101];
} eeVars;
...
EZBL_WriteROMObj(addr, &eeVars);
Если бы вы знали, что ваша структура будет содержать только массив и ничего больше, вы можете получить размер массива с помощью sizeof(srcRAMObjPtr->MY_LUT)
, но этоможет сделать код менее гибким, зачем делать это, когда вы можете просто разыменовать указатель?
Макрос EZBL_WriteROMObj
, кажется, пытается определить, является ли переданный параметр массивом, но это неверно, потому чтоvoid*
не относится к типу struct eevars*
или любому другому указателю.Лучший способ проверить, является ли параметр массивом, с использованием расширений GNU:
#define EZBL_WriteROMObj(destPgmAddr, srcRAMObjPtr)\
{\
if(__builtin_types_compatible_p(typeof(srcRAMObjPtr), typeof(&(srcRAMObjPtr)[0])))\
{\
/* regular pointer case */ \
printf("%d\n", sizeof(*srcRAMObjPtr));\
EZBL_ModifyROM((destPgmAddr), (srcRAMObjPtr), sizeof(*srcRAMObjPtr));\
}\
else /* array case */ \
{\
printf("%d\n", sizeof(srcRAMObjPtr));\
EZBL_ModifyROM((destPgmAddr), (srcRAMObjPtr), sizeof(srcRAMObjPtr));\
}\
}
Таким образом, вы можете передать либо указатель на структуру, либо массив:
struct
{
int MY_LUT[101];
} eeVars;
...
EZBL_WriteROMObj(addr, &eeVars);
/* or: */
EZBL_WriteROMObj(addr, eeVars.MY_LUT);