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

时间:2015-04-02 16:40:54

标签: c++ c

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

2 个答案:

答案 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值。