0

に保存されている名前の配列がありますchar *namelist[]。関数に渡すと、次のすべての名前を表示できませんnamelist

int ReadListOfName(const char* names[])
{
  //Note: I always get the len = 1
  //      Anyway I can get total items in names

  int len = sizeof(names)/sizeof(char*);
  for (i=0; i<len; i++)
    printf("%d-%s\n",i,names[i]);

  return 0;

}

int main(void)
{
  const char* names[] = {"a","b","c"};
  ReadListOfName(names);
  return 0;
}

どうしたの?

4

6 に答える 6

4
int len = sizeof(names)/sizeof(char*);

これは要素の数を取得せずsizeof、ポインターで必要なことを行いません。関数に追加の引数として長さを渡す必要があります。このC FAQでも説明されています。あなたは試すことができます:

int ReadListOfName(const char* names[], size_t len)
/* ... */

ReadListOfName(names, sizeof(names)/sizeof(names[0]));
于 2012-07-05T06:13:42.760 に答える
1
int ReadListOfName(const char* names[])

これでnames本質的に定義されたchar **ものではなく、あなたの.char * []main

于 2012-07-05T06:16:20.333 に答える
1

配列の長さを指定するために別の引数を渡すReadListOfNameか、配列に終了値を持たせる必要がありますargv。関数に渡されると、配列はポインターに崩壊します。配列の最初の要素のアドレスを渡しているため、 a はachar*[]に減衰します。char**したがって、関数は実際には次のように解釈されます。

int ReadListOfName(const char **names)

そして、実際には を等号sizeof(char**)/sizeof(char*)化していますが、配列内の要素の数はわかりません (おそらく 1 になります)。

長さの引数を追加し、lenそれを渡す前に計算しReadListOfNameます。

で割って配列内の要素の数を取得するのではなく、 で割ることができることに注意sizeof(names)してください。sizeof(char*)sizeof(*names)char*names

int len = sizeof(names)/sizeof(*names);
于 2012-07-05T06:20:54.267 に答える
1

他の回答は、配列参照を関数に渡すときに何が起こるかを既に説明しているため、名前を出力するメソッドに別のパラメーターを追加せずに問題を解決する方法を見つけてください。

次のようにリストにストッパー要素を追加したい場合があります。

#include <stdio.h>

int ReadListOfName(const char ** names)
{
  for (int i=0; names[i]; i++)
    printf("%d-%s\n",i,names[i]);

  return 0;
}

int main(void)
{
  const char* names[] = {"a","b","c", NULL}; /* Please note the additional, last element. */
  ReadListOfName(names);
  return 0;
}

リストを説明する 2 つの引数を渡す方法とのこのアプローチの本質的な違いは、リストのサイズの情報がリスト自体からではなく、独立して提供された 2 番目の値から引き出されるため、この方法を使用するとエラーが発生しにくいnames[]という事実です。

于 2012-07-05T06:26:01.453 に答える
0

配列の長さを明示的に言及する追加の引数を渡す必要があります。そして、sizeofsをいじるためにいくつかのMACROをセットアップしている場所。

于 2012-07-05T09:14:41.530 に答える
0

sizeof(AnyPointer)はワード サイズを示します。32ビットOSの場合は4を返します。同様に、64 ビット マシンでは 8 が返されます。

そうsizeof(char*) == sizeof(float*) == sizeof(int*)です。

If your OS is 32-bit,
sizeof(names) will be 4.
sizeof(char*) also 4.

明らかにあなたは得るでしょうlen = 1

于 2012-07-05T07:25:39.393 に答える