可能重复:
如何找到 sizeof(指向数组的指针)
我有以下代码
int myfunc(char *arr)
{
const int sizearr = sizeof( arr ) / sizeof(char);
}
这会产生指针的大小,而不是我传递给函数的 char 数组 [17] 的大小。
我知道我可以使用 strlen 并解决问题,但是有什么方法可以将 char*arr 指针转换回我传递给函数的 char 数组 [17] 以便使用 sizeof(char 数组 [17]) ?
可能重复:
如何找到 sizeof(指向数组的指针)
我有以下代码
int myfunc(char *arr)
{
const int sizearr = sizeof( arr ) / sizeof(char);
}
这会产生指针的大小,而不是我传递给函数的 char 数组 [17] 的大小。
我知道我可以使用 strlen 并解决问题,但是有什么方法可以将 char*arr 指针转换回我传递给函数的 char 数组 [17] 以便使用 sizeof(char 数组 [17]) ?
如果要传递 17 个字符的数组,则需要通过引用传递它(仅限 C++):
int myfunc(char (&arr)[17])
{
unsigned int const sizearr = sizeof arr;
// ...
}
或者做一个模板来推导出大小:
template <unsigned int sizearr>
int myfunc(char (&arr)[sizearr])
{
// ...
}
在 C 中,您根本不能将数组作为参数传递,因此您有责任单独传达数组大小。
更新:正如@David 所建议的,您可以通过将指针传递给数组来修复 C 中的数组类型:
int myfunc(char (*arr)[17])
{
unsigned int const sizearr = sizeof *arr;
// ...
}
int main()
{
char s[17];
return myfunc(&s);
}
不,没有这样的方法。但在 C++ 中,您可以通过数组大小参数化函数模板并通过引用传递数组:
template <size_t size> void myfunc(char (&arr)[size])
{
for(size_t i = 0; i < size; ++i) std::cout << arr[i];
}
// Usage
char array[] = "My char array";
myfunc(array);
不。
没有这样的方法。该类型char *不包含有关“源”的任何信息,即数组。这就是为什么说数组“衰减”为指针的原因。指针的信息比数组少。
另外,sizeof (char)是 1。
不是真的,因为一旦数组衰减到一个指针,所有关于它的“原始”形式的信息都已经丢失了。您始终可以将指针转换为 achar[17]但这是不好的做法。
如果您确实需要一个数组,请将函数签名更改为接受一个数组。