C++ 函数中二维字符数组的长度

C++ 函数中二维字符数组的长度,c++,c,C++,C,这是一个小代码段。在函数g()中,是否有任何方法可以知道[]中的字符串数,即在本例中为4 大体上,我可以通过sizeof()函数来实现这一点,但因为我要将地址传递给函数g(),我的电脑是64位的,即g()中的sizeof(a)是8,指针的大小,但我必须知道字符串的数量 void g(char *a[]) { printf("%d\n",sizeof(a)/sizeof(a[0])); } int main() { char *a[]={"1","2","3","4"};

这是一个小代码段。在函数g()中,是否有任何方法可以知道[]中的字符串数,即在本例中为4

大体上,我可以通过sizeof()函数来实现这一点,但因为我要将地址传递给函数
g()
,我的电脑是64位的,即g()中的sizeof(a)是8,指针的大小,但我必须知道字符串的数量

void g(char *a[])
{
    printf("%d\n",sizeof(a)/sizeof(a[0]));
}
int main()
{
    char *a[]={"1","2","3","4"};
    printf("%d\n",sizeof(a)/sizeof(a[0]));
    g(a);
}

在C语言中,您需要将数组的大小传递给函数,或者使用sentinel值

已经有很多非常类似的问题,解释了什么是数组,它们是如何传递给函数的,以及它们的含义是什么。应该为你提供足够的信息来解决这个问题。。。仍然:

你不能那样做,反正也不可靠。一旦将数组传递给函数,它就会衰减为指针(64位平台上的指针大小为8,32位平台上的指针大小为4)。函数参数
char*a[]
是一种不完整类型。它指定指针数组,但该数组的长度未指定。您可以完成以下类型:

void g(char *a[4])
{}
在这种情况下,代码可以工作,但这有点危险,因为函数可能会使用不同长度的数组调用

更常见的是需要传递第二个参数(通常为
size\t
),该参数指定传递的数组的长度:

void g(char *a[], size_t arr_len)
{}
此函数的调用方式如下:

g(an_array, sizeof an_array/ sizeof *an_array);
其中,
a_数组
当然是一个数组,
sizeof a_数组
是其大小(以字节为单位),除以数组中值类型的大小
sizeof*an_数组
是编写
sizeof a_数组[0]
的另一种方法。它还依赖于这样一个事实,即数组在大多数情况下都会衰减为指针,而且由于C标准将
数组[0]
指定为与
*(数组+0)
相同,因此它们是可互换的

只是吹毛求疵:您可能希望更改此选项:

char *a[]={"1","2","3","4"};
您在此处实际声明和初始化的内容:

const char *a[]={"1","2","3","4"};
a
中的
char*
是常量,它们不能更改,因为它们位于只读内存中,最好自己分配内存,或者写入

char a[][] = {"1", "2", "3", "4"};

它将字符串复制到RW内存中

选择一种语言。是的,你可以用C++的非类型参数推导,用“代码>g < /代码>”作为固定模板,不做任何事情,而不必通过长度。真的。
sizeof
不是一个函数,顺便说一句,它是一个运算符。谢谢你的回答,实际上我正在解决一个在线竞赛,我已经解决了问题的主要部分,不包括这部分,
http://www.techgig.com/codegladiators/openparticipation/dashboard
easy level。我现在不知道该怎么办:(