这是一个小代码段。在函数g()中,有没有办法知道[]中的字符串数,即在这种情况下是4。
在main中我可以在sizeof()函数的帮助下得到这个,但是因为我将地址传递给函数g()
而我的pc是64位,即sizeof(a)在g()内部是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);
}
答案 0 :(得分:2)
在SO上已经有许多非常相似的问题,它们解释了什么是数组,它们如何传递给函数,以及它们的含义是什么。 This one, for example应该为您提供足够的信息来解决这个问题......仍然:
你无法做到这一点,无论如何都不可靠。一旦数组传递给一个函数,它就会衰减成一个指针(64位平台的大小为8,4位为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);
其中an_array
当然是一个数组,sizeof an_array
是它的大小(以字节为单位)除以数组中值的类型大小。 sizeof *an_array
是另一种撰写sizeof an_array[0]
的方式。它还依赖于数组在大多数时间内衰减为指针的事实,并且由于C标准将array[0]
指定为与*(array + 0)
相同,因此它们是可互换的......
只是挑剔:你可能想改变这个:
char *a[]={"1","2","3","4"};
您在此处实际宣布和初始化的内容:
const char *a[]={"1","2","3","4"};
char *
中的a
是常量,因为它们位于只读内存中而无法更改, 分配内存会更好你自己,或写
char a[][] = {"1", "2", "3", "4"};
将字符串复制到RW存储器
答案 1 :(得分:1)
在C中,您需要将数组的大小传递给函数或使用sentinel值。