繁体   English   中英

函数中2-D char数组的长度

[英]length of a 2-D char array in a function

这是一个小代码片段。 在函数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);
}

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

不管怎么说,你不能这样做。 一旦数组传递给一个函数,它就会衰减成一个指针(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存储器中

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM