1

標準入力によって設定された配列のサイズを取得しようとしています:

char *myArray;
cin >> myArray
cout << sizeof(myArray);

これは、「40905898」など、長さが 4 より大きい文字列を入力すると 4 を返します。

どこが間違っているのですか?

4

8 に答える 8

11

sizeofoperator は、渡したもののサイズを静的に評価します。Achar*は、マシンのアーキテクチャに応じて特定のサイズ (32 ビット システムでは 4 バイト、64 ビット マシンでは 8 バイト) を持つポインタです。あなたがやろうとしていることを達成するために、ソースファイルに追加するstringことで使用できるタイプを使用することをお勧めします。#include <string>using namespace std;

string line;
cin >> line;
cout << line.length() << endl;

エラーが発生しにくく、使いやすいです。

ところで、あなたがやろうとしたことは本当に危険です。実際、 を使用するときはcin >> myArray、まだ割り当てていないメモリが割り当てられているはずmyArrayです。これによりメモリが破損し、プログラムがクラッシュする可能性があり、バッファ オーバーラン攻撃を受ける可能性があります。

C++ の単純な配列には、そのサイズがわかりません。sizeof 配列が静的に割り当てられ、配列自体で使用している場合にのみ使用できますsizeof。配列への別のポインターではありません。たとえば、これは期待どおりに機能しません。

int x[5];
int *a = &x[0];
// a[i] is now the same as x[i] but:
cout << sizeof(x) << endl; // prints 20, assuming int is 32 bits long
cout << sizeof(a) << endl; // prints 4, assuming a pointer is 32 bits long

要素数ではなく、配列の合計サイズが最初の行に出力されることに注意してください。sizeof(x)/sizeof(*x)静的配列の要素数を調べるために使用できます。を使用して動的に割り当てられた配列では、これは不可能ですnew。実際、C++ 配列は非常にエラーが発生しやすいため、それらを操作するときは細心の注意を払う必要があり、ほとんどの場合、代わりにvectorandを使用することをお勧めします。string

于 2008-12-18T12:46:09.920 に答える
2

sizeof(pointer) は常に 4 を返します。 strlen() を使用します。

編集: IIRC、sizeof はコンパイル時に評価されます。内容ではなく、型のみが考慮されます。

于 2008-12-18T12:39:27.780 に答える
1

これは、myArray が 4 バイトを占有するポインターであるためです。文字列の長さを取得したい場合は、strlen などを使用します。

于 2008-12-18T12:40:00.057 に答える
0

ここには多くの問題があるようです:

myArray が初期化されていません - 入力はどこに保存されますか?

通常は次のように使用します: cin >> myArray; (シェブロンとセミコロンの方向に注意してください)

sizeof(myArray) は常に同じ値を返します (プラットフォームでは 4)

代わりにこのバージョンを試してください:

char* myArray= new char[50];
cin >> myArray;
cout << myArray;
cout << strlen(myArray);

独自の問題がないわけではありません(myArrayを削除する必要がありました)ので、ここで使用する回答を試してくださいstring myArray

于 2008-12-18T12:50:40.350 に答える
0

これは、32 ビット コンピューターでは 4 バイトのポインターで sizeof() を使用しているためです。

printf("Pointer size: %d\n", sizeof(void*));

配列が null で終わる文字列 (最後の要素が 0 バイトまたは '\0') の場合、次を使用できます。

strlen(myArray)

要素の数 (マイナス 1) を取得します。例えば:

myArray = "Hello, world!";
printf("Number of characters: %d\n", strlen(myArray));

次のように、静的に割り当てられた配列を使用することもできます。

 char array[128];
 printf("sizeof(array) = %d\n", sizeof(array));
 // prints 128
于 2008-12-18T12:51:00.050 に答える
0

他の人が言ったように、myArray はポインターです。

しかし、なぜあなたは使わないのですstd::stringか?自分でバッファー割り当てを行う必要はありませんが、例では間違っています (ポインターmyArrayは何も指していません) 。

std::string myValue;
std::cin >> myValue;
std::cout << myValue.length();

必要に応じて、 を使用して文字列のポインター表現を取得できますstring::c_str()

于 2008-12-18T12:51:27.930 に答える
0

他の人が言っsizeofたように、渡されたオブジェクトのサイズを返しますが、ポインターの場合はポインターのサイズです。sizeofポインターをたどって、それが指しているオブジェクトのサイズを確認しませchar(それが1つまたは配列を指している可能性があることをどうやって知ることができますか?知る方法はありません)。

さらに、から読み取る場合cin、データを読み取る必要があるスペースを割り当てる必要がありますが、cinスペースは割り当てられません。スタックまたはヒープのいずれかにスペースを割り当てることができます。

char stack_line[1024]; // This will overflow if more than 1024 chars are needed
char heap_line*  = new char[1024]; // ditto

ここで注意すべきことは、[32 ビット マシンで]sizeof(stack_line) == 1024 while演算子を使用するときは注意する必要があるということです。sizeof(heap_line) == 4 sizeof

実際にstd::stringは、スペース自体を割り当てる方法を知っている を使用することをお勧めします。

于 2008-12-18T12:53:46.193 に答える
0

sizeof(myArray) を使用する場合、sizeof(*myArray); を実行する必要があります。ポインターの場合、星は値ではなくアドレスであるためです。このような:

char *myArray;
cin >> *myArray;
cout << *myArray;
于 2014-11-25T18:11:18.600 に答える