可能重复:
How to find the sizeof(a pointer pointing to an array)
我有以下代码
int myfunc(char *arr)
{
const int sizearr = sizeof( arr ) / sizeof(char);
}
这会产生指针的大小,而不是我传递给函数的char数组[17]的大小。
我知道我可以使用strlen并解决问题,但有没有办法将char * arr指针转换回char数组[17]我传递给函数以使用sizeof(char数组[ 17])?
答案 0 :(得分:6)
如果要传递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);
}
答案 1 :(得分:1)
不,没有这样的方法。但是在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);
答案 2 :(得分:0)
没有
没有这样的方法。类型char *
不包含有关“源”的任何信息,即数组。这就是为什么说数组“衰变”成指针的原因;指针的信息少于数组。
此外,sizeof (char)
为1。
答案 3 :(得分:0)
不是真的,因为一旦数组有decayed to a pointer,有关其“原始”形式的所有信息都已丢失。您总是可以将指针强制转换为char[17]
,但这是不好的做法。
如果您确实需要一个数组,请更改函数签名以接受数组。