【问题标题】:How to know the size (in bytes) of a char array passed to a function?如何知道传递给函数的 char 数组的大小(以字节为单位)?
【发布时间】:2016-01-18 05:55:21
【问题描述】:

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

#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);
}

【问题讨论】:

  • test2() 中,根本无法知道arrayU 指向的数组的大小,除非您传入另一个大小参数(至少在C++ 的当前状态下)标准)。有关详细信息,请参阅How to find the 'sizeof'(a pointer pointing to an array)?
  • c-sizeof-a-passed-array的可能重复
  • 你不能。您需要以某种方式传递大小,通常作为另一个形式参数
  • 当您将数组a[] 作为参数传递时,它会衰减为指针*a,因此sizeof a 只返回指针的大小,而sizeof *a 只返回指针的大小1type 的存储大小。
  • 使用正确的格式说明符 %zu 打印 sizeof 的值,否则会触发未定义的行为

标签: c arrays pointers char sizeof


【解决方案1】:

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

在这两个声明中:

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

arrayTarrayU 由于这种衰减而具有完全相同的类型,sizeof 将为两者返回相同的值,即 char * 的大小。

对比一下:

char array1[] = "a string";
char *array2;

其中array1 实际上是一个大小为 9 的数组,而array2 是一个大小(在您的系统上)为 4 的指针。

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

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

【讨论】:

  • 使用size_t len而不是int len可以避免test(char arrayT[], int len)test(arrayX, sizeof arrayX)引起的类型变化和可能的信息丢失
  • @chux 很好。已更新。
  • 感谢 dbush 和所有其他人。现在清澈如水!
猜你喜欢
  • 1970-01-01
  • 2012-02-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2018-11-08
  • 2016-09-22
  • 2014-07-27
  • 2023-03-25
相关资源
最近更新 更多