sizeof - 将指针转换为数组

时间:2012-09-21 12:19:24

标签: c++ c

  

可能重复:
  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])?

4 个答案:

答案 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],但这是不好的做法。

如果您确实需要一个数组,请更改函数签名以接受数组。