0

可能重复:
如何找到 sizeof(指向数组的指针)

我有以下代码

int myfunc(char *arr)
{
const int sizearr = sizeof( arr ) / sizeof(char);
}

这会产生指针的大小,而不是我传递给函数的 char 数组 [17] 的大小。

我知道我可以使用 strlen 并解决问题,但是有什么方法可以将 char*arr 指针转换回我传递给函数的 char 数组 [17] 以便使用 sizeof(char 数组 [17]) ?

4

4 回答 4

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);
}
于 2012-09-21T12:23:06.427 回答
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);
于 2012-09-21T12:24:12.790 回答
0

不。

没有这样的方法。该类型char *不包含有关“源”的任何信息,即数组。这就是为什么说数组“衰减”为指针的原因。指针的信息比数组少。

另外,sizeof (char)是 1。

于 2012-09-21T12:21:25.490 回答
0

不是真的,因为一旦数组衰减到一个指针,所有关于它的“原始”形式的信息都已经丢失了。您始终可以将指针转换为 achar[17]但这是不好的做法。

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

于 2012-09-21T12:21:44.910 回答