0

重複
の可能性: sizeof (配列を指すポインター) を見つける方法

次のコードがあります

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

これにより、関数に渡した char 配列 [17] のサイズではなく、ポインターのサイズが得られます。

strlen を使用して問題を解決できることはわかっていますが、char*arr ポインターを変換して char 配列 [17] に戻す方法はありますか? sizeof(char array[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

配列がポインターに減衰すると、その「元の」形式に関するすべての情報が失われるため、そうではありません。いつでもポインターを a にキャストできますが、char[17]それは悪い習慣です。

本当に配列が必要な場合は、配列を受け入れるように関数のシグネチャを変更してください。

于 2012-09-21T12:21:44.910 に答える