Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从函数参数获取数组的大小_C_Arrays_Sizeof - Fatal编程技术网

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中不可能以这种方式获得数组的大小,因为数组被转换为指向其第一个元素的指针。您必须自己将数组的大小作为函数参数。