私はこの疑問を持っています: この場合に char 配列のサイズを取得する方法:
#include<stdio.h>
void f(char * x)
{
printf("Size %d\n", sizeof(x)/sizeof(char));
}
main()
{
char x[5] = {'a', 'e', 'i', 'o', 'u'};
f(&x[0]);
}
予想に反して、5 や 6 ではなく 8 を受け取りました。何が問題なのですか?
ありがとう!
sizeof(x)
あなたのコードでは、指してchar *x
いるchar配列のサイズではなく、ポインターのサイズを返しますx
64 ビット システムのポインタのサイズは 8 です。32 ビット システムの場合、ポインタのサイズは 4 です。
ここでsizeof()
は、元の配列のサイズではなく、ポインターのサイズを返します。
f()
が指している配列のサイズを知る唯一の方法はchar*
、呼び出し元から伝えられることです。
void f(char * x, size_t size)
{
...
}
main()
{
char x[5] = {'a', 'e', 'i', 'o', 'u'};
f(x, sizeof(x) / sizeof(x[0]));
}
それはいけません。sizeof
ポインタのサイズを返します。
配列のサイズを変数に格納し、それも渡します。
私はこれを好みます:
void f(char *x, int size)
{
// ...
}
main()
{
char x[5] = {'a', 'e', 'i', 'o', 'u'};
f(x, 5);
}
あなたはこのようにそれを取得します
void f(char * x, int size_of_array)
{
printf("Size %d\n", size_of_array);
}
main()
{
char x[5] = {'a', 'e', 'i', 'o', 'u'};
f(&x[0], 5);
}
配列を渡すと、その型のポインターに崩壊し、sizeof マクロを介して配列のサイズを取得する機能が失われます。要素数を渡す必要があります。配列が数値型の場合、配列のサイズを常に最初の要素として渡すことができます。
void f(char * x)
{
printf("Size %d\n", x[0]);
}
main()
{
char x[6] = {6, 'a', 'e', 'i', 'o', 'u'};
f(&x[0]);
}
ただし、もちろん、この場合、その要素を更新して、期待どおりに一致するようにするための追加のオーバーヘッドがあります。
sizeof(x)
配列のサイズではなく、char ポインターのサイズを示します。char *
charへのポインタです。実行すれば、char a = 'A';
f(&a);
それはまだ有効です。char *
は char 配列のみを指すようには設計されていないためsizeof(x)
、ポインターが指している対象ではなく、ポインターのサイズを返します。