5

スタック上に固定サイズの文字配列を作成しようとしています (スタックを割り当てる必要があります)。私が抱えている問題は、スタックが配列に8バイト以上を割り当てることができないことです:

#include <iostream>
using namespace std;

int main(){
        char* str = new char[50];
        cout << sizeof(str) << endl;

        return 0;
}

版画

8

固定サイズの配列 (この場合は 50 バイトですが、任意の数) をスタックに割り当てるにはどうすればよいですか?

4

4 に答える 4

10
char* str = new char[50];
cout << sizeof(str) << endl;

プラットフォーム上のポインターのサイズを出力8します。以下と同じです。

cout << sizeof(void*) << endl;
cout << sizeof(char*) << endl;
cout << sizeof(int*) << endl;
cout << sizeof(Xyz*) << endl;  //struct Xyz{};

これらはすべて8、プラットフォームで印刷されます。

必要なものは次のいずれかです。

//if you need fixed size char-array; size is known at compile-time.
std::array<char, 50> arr; 

//if you need fixed or variable size char array; size is known at runtime.
std::vector<char> arr(N); 

//if you need string
std::string s;
于 2012-08-13T16:58:44.847 に答える
8

50 * sizeof(char)実際には、または 50 バイトを割り当てています。ポインタのサイズですsizeof(str)sizeof(char*)

于 2012-08-13T16:58:52.883 に答える
2

C 配列をスタックに置くには、次のように記述する必要があります。

char myArray[50] = {0};

これを行うC++の方法は次のとおりです-Nawazが指摘したように

std::array<char, 50> arr;

しかし、この配列の内容がスタックに存在するかどうかはわかりません。

于 2012-08-13T17:02:30.360 に答える
1

strhere は、 size の文字の配列を参照しています50*sizeof(char)。しかし、それが参照しているものではなくsizeof(str)sizeofstr変数を出力していsizeofます。strこれは単なるポインタ変数であり、ポインタ変数はサイズが の符号なし整数です8

sizeofまた、参照(この場合、文字配列のサイズ)を決定することもできません。これは、ポインターが何を指しているかをコンパイラーが認識していないためです。

編集: sizeofC/C++ では、ポインターが指しているものを取得することはあまり意味がありません。intポインターがプリミティブ型 ( 、 など)を指していると仮定すると、long直接sizeof(int). この場合のように、ポインターが配列を指している場合は、直接実行できますarraySize * sizeof(dataTypeOfArray)arraySizeC/C++ では未知のサイズの配列を定義することが許可されていないため、とにかく既知であり、dataTypeOfArrayとにかく既知です。

于 2012-08-13T17:02:19.073 に答える