C 从函数参数获取数组的大小
我有以下资料:C 从函数参数获取数组的大小,c,arrays,sizeof,C,Arrays,Sizeof,我有以下资料: typedef unsigned char BYTE; size_t arrMod (BYTE ARR[3]) { ARR[1] = 255; return sizeof(ARR); } int main() { BYTE arr[3]; size_t s = arrMod(arr); fprintf(stdout, "Size = %i\nARR[0] = %i\nARR[1] = %i\nARR[2] = %i",
typedef unsigned char BYTE;
size_t arrMod (BYTE ARR[3])
{
ARR[1] = 255;
return sizeof(ARR);
}
int main()
{
BYTE arr[3];
size_t s = arrMod(arr);
fprintf(stdout,
"Size = %i\nARR[0] = %i\nARR[1] = %i\nARR[2] = %i",
s, arr[0], arr[1], arr[2]);
return 1;
}
输出为:
Size = 12
ARR[0] = 0
ARR[1] = 255
ARR[2] = 0
我知道我不能给它
sizeof(ARR)
以获得所需的3个字节,因为数组会衰减为指针。我基本上收到了指针的大小。如何从函数中获取arr的大小(3)作为返回值?唯一的方法是将函数的参数声明为数组指针。比如说
size_t arrMod (BYTE ( *ARR )[3] )
{
( *ARR )[1] = 255;
return sizeof( *ARR );
}
但在这种情况下,只能使用包含三个元素的数组
否则,在C语言中,不可能获得包含任意数量元素的数组的大小
根据C标准
3除非它是sizeof运算符或一元数的操作数&
运算符,或是用于初始化数组的字符串文字
类型为“”的数组“”的表达式转换为
类型为“指向类型的指针”且指向初始值的表达式
数组对象的元素,并且不是左值。如果数组对象
已注册存储类,行为未定义
写入
返回3代码>或大小\u t arrMod(字节(*ARR)[3])
,调用arrMod(&ARR)
,返回sizeof(*ARR)
如果希望通过值传递参数,请将ARR[3]
放在结构中
@BLUEPIXY我不能只返回3。如果我声明更大的数组呢?我还必须编辑函数..您可以使用定义当您将数组传递给函数时,数组大小将丢失的信息作为指向它的指针传递。从指针中查找原始数组的大小是不可能的。。这就是我的观点。限制用户声明更大的数组。我现在要测试它。你能解释一下这在内存中是如何发生的吗?我用声明arr[2]
进行了测试,它再次返回3。@Edenia正如我写的那样,在C中不可能以这种方式获得数组的大小,因为数组被转换为指向其第一个元素的指针。您必须自己将数组的大小作为函数参数。