我需要在例程内传递一个数组,然后读取其大小。
typedef struct
{
unsigned char Name[20];
}Sensors_;
extern volatile Sensors_ Sensor;
然后在源文件中
我正在使用这种方法
void Save(){
SaveValue(Sensor.Name)
}
void SaveValue(volatile unsigned char Array[]){
printf("%d",sizeof(Array));
}
我的数组的实际大小是20个字符,但是我得到的输出是2。 为什么会这样呢?我正在将数组传递给方法,所以大小与第一个数组不同吗?
我也不想将其作为Sensors_传递,因为它也是其他名称的通用方法。
答案 0 :(得分:3)
Array
将作为指针传递,而sizeof
将不知道实际对象的大小。它将为您提供指针的大小。
要使您的方法(在C中称为函数)通用,您必须 传递数组的大小:
void SaveValue(volatile unsigned char Array[], size_t size);
答案 1 :(得分:3)
在大多数情况下,数组在表达式中使用时会衰减到指向其第一个元素的指针中。特别是,当数组是函数的参数时,实际传递的是指向第一个元素的指针。
实际上您的函数声明:
void SaveValue(volatile unsigned char Array[])
完全等同于:
void SaveValue(volatile unsigned char *Array)
该函数接收的是指针,而不是实际的数组,因此sizeof
的计算结果为指针的大小。
将数组传递给函数时,需要显式地将长度作为单独的参数传递。