3

私はこの疑問を持っています: この場合に 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 を受け取りました。何が問題なのですか?

ありがとう!

4

5 に答える 5

5

sizeof(x)あなたのコードでは、指してchar *xいるchar配列のサイズではなく、ポインターのサイズを返しますx

64 ビット システムのポインタのサイズは 8 です。32 ビット システムの場合、ポインタのサイズは 4 です。

于 2013-04-01T13:41:26.300 に答える
3

ここで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]));
}
于 2013-04-01T13:40:26.043 に答える
0

それはいけません。sizeofポインタのサイズを返します。

配列のサイズを変数に格納し、それも渡します。

私はこれを好みます:

void f(char *x, int size)
{
// ...
}

main()
{
  char x[5] = {'a', 'e', 'i', 'o', 'u'};
  f(x, 5);
}
于 2013-04-01T13:41:15.687 に答える
0

あなたはこのようにそれを取得します

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]);
}    

ただし、もちろん、この場合、その要素を更新して、期待どおりに一致するようにするための追加のオーバーヘッドがあります。

于 2013-04-01T13:43:17.977 に答える
0

sizeof(x)配列のサイズではなく、char ポインターのサイズを示します。char *charへのポインタです。実行すれば、char a = 'A'; f(&a);それはまだ有効です。char *は char 配列のみを指すようには設計されていないためsizeof(x)、ポインターが指している対象ではなく、ポインターのサイズを返します。

于 2013-04-01T13:46:41.103 に答える