C 如何知道传递给函数的字符数组的大小(以字节为单位)?

C 如何知道传递给函数的字符数组的大小(以字节为单位)?,c,arrays,pointers,char,sizeof,C,Arrays,Pointers,Char,Sizeof,我正在测试运算符的大小。 在我的代码中有两种情况,我得到了指针的大小。 在其他情况下,我得到数组占用的字节数。 当我将数组传递给函数时,如何获得数组的大小(以字节为单位)? 运算符的大小是否足够? 我做错什么了吗 #include <stdio.h> /*Testing the operator sizeof*/ void test (char arrayT[]); void test2 (char *arrayU); int main(int argc, char *argv

我正在测试运算符的大小。 在我的代码中有两种情况,我得到了指针的大小。 在其他情况下,我得到数组占用的字节数。 当我将数组传递给函数时,如何获得数组的大小(以字节为单位)? 运算符的大小是否足够? 我做错什么了吗

#include <stdio.h>

/*Testing the operator sizeof*/

void test (char arrayT[]);
void test2 (char *arrayU);

int main(int argc, char *argv[]){

    char array1[7];
    printf("array1 size is:%d\n", sizeof array1);
    /*array1 size is: 7*/

    char array2[] = { '1', '2', '3', '4', '5', '6', '7'};
    printf("array2 size is:%d\n", sizeof array2);
    /*array2 size is: 7*/

    char array3[] = "123456";
    printf("array3 size is:%d\n", sizeof array3);
    /*array3 size is: 7*/

    unsigned char array4[] = "123456";
    printf("array4 size is:%d\n", sizeof array4);
    /*array4 size is: 7*/

    char arrayX[] = "123456";
    test(arrayX);
    /*arrayT size is: 4*/

    char arrayY[] = "123456";
    test2(&arrayY[0]);
    /*arrayU size is: 4*/

    return 0;
}

void test (char arrayT[]){
    printf("arrayT size is:%d\n", sizeof arrayT);
}

void test2 (char *arrayU){
    printf("arrayU size is:%d\n", sizeof arrayU);
}
#包括
/*测试运算符sizeof*/
孔隙测试(char arrayT[]);
无效测试2(char*arrayU);
int main(int argc,char*argv[]){
字符阵列1[7];
printf(“array1大小为:%d\n”,array1大小);
/*阵列1大小为:7*/
字符数组2[]={'1','2','3','4','5','6','7'};
printf(“array2大小为:%d\n”,array2大小);
/*阵列2大小为:7*/
字符数组3[]=“123456”;
printf(“阵列3大小为:%d\n”,阵列3的大小);
/*阵列3大小为:7*/
无符号字符数组4[]=“123456”;
printf(“阵列4大小为:%d\n”,阵列4的大小);
/*阵列4大小为:7*/
char arrayX[]=“123456”;
试验(arrayX);
/*阵列大小为:4*/
字符数组[]=“123456”;
test2(&arrayY[0]);
/*面积为:4*/
返回0;
}
无效测试(字符阵列[]){
printf(“arrayT大小为:%d\n”,arrayT的大小);
}
无效测试2(字符*arrayU){
printf(“arrayU大小为:%d\n”,arrayU的大小);
}

将数组传递给函数时,实际发生的是传递指向数组中第一个元素的指针。换句话说,数组衰减为指向第一个元素的指针

在这两项声明中:

void test (char arrayT[]);
void test2 (char *arrayU);
由于这种衰减,
arrayT
arrayU
属于完全相同的类型,
sizeof
将为两者返回相同的值,即
char*
的大小

将上述内容与此进行对比:

char array1[] = "a string";
char *array2;
其中
array1
实际上是大小为9的数组,而
array2
是大小为4的指针(在系统上)

因此,无法知道传递给函数的数组的长度。您需要将尺寸作为单独的参数传入:

void test (char arrayT[], size_t len);

在<代码> TEST2()中,除非您在大小上传递另一个参数(至少在C++标准的当前状态),否则根本不可能知道由代码> ARRAYU指向的数组的大小。有关更多详细信息,请参阅。无法复制您的。您需要以某种方式传递大小,通常作为另一个正式参数传递数组
a[]
作为参数时,它会衰减为指针
*a
,因此
sizeof a
只返回指针的大小,而
sizeof*a
只返回该
类型的
1
的存储大小。请使用正确的格式说明符%zu打印sizeof的值,否则会使用
size\t len
而不是
int>触发未定义的行为len
避免了由于
测试(char arrayT[],int len)
测试(arrayX,sizeof arrayX)
@chux良好捕获而导致的类型更改和可能的信息丢失。更新。谢谢dbush和所有其他人。现在清澈如水!