C の構造体に制限があるかどうかを尋ねたいと思います。
私は持っている:
#define MAX_DOC_LENGTH (1<<22)
と:
struct MyDocument {
DocID doc_id;
unsigned int num_res;
QueryID* query_ids;
unsigned int size;
char str[MAX_DOC_LENGTH];
};
C の構造体に制限があるかどうかを尋ねたいと思います。
私は持っている:
#define MAX_DOC_LENGTH (1<<22)
と:
struct MyDocument {
DocID doc_id;
unsigned int num_res;
QueryID* query_ids;
unsigned int size;
char str[MAX_DOC_LENGTH];
};
4MBはおそらくスタックには大きすぎるでしょう。str
に割り当てますheap
。
struct MyDocument {
DocID doc_id;
unsigned int num_res;
QueryID* query_ids;
unsigned int size;
char* str;
};
そして、あなたが割り当てるとき:
struct MyDocument doc;
doc.str = malloc(MAX_DOC_LENGTH);
heap
またはで構造のインスタンスを作成するかどうかによって異なりますstack
。オブジェクトへのポインタを定義してheap
throughmalloc
に割り当てる場合、システムの使用可能なメモリに依存します。
スタック上のオブジェクトのインスタンスを として定義するstruct MyDocument mydoc;
と、システムにはそれほど大きなスタック値がないため、これは失敗するはずです。
str
ポインタ ie として宣言しchar *str
、同じものにメモリを割り当てることをお勧めしmalloc
ます。
構造定義は次のように再定義できます。
struct MyDocument {
DocID doc_id;
unsigned int num_res;
QueryID* query_ids;
unsigned int size;
char *str; // Modified the declaration
};
この変更により、オブジェクトを作成する場所が か かは問題になりませstack
んheap
。オブジェクトにを定義している場合は、以下の例に示すようにpointer
、オブジェクトを割り当てることができますstr
struct MyDocument *myDoc; // Declare an object pointer
myDoc = malloc(sizeof(MyDocument)); // Allocate memory for the object
myDoc->str = malloc(sizeof(char) * MAX_DOC_LENGTH); // Allocates memory for str
または、スタック上にオブジェクトを定義し、スペースを割り当てることもできますstr
。
struct MyDocument someDoc; // Declare an object
someDoc.str = malloc(sizeof(char) * MAX_DOC_LENGTH); // Allocates memory for str
ここで問題は、構造内で宣言された変数の数ではなく、文字列 str のサイズに関連付けられています。コンパイラによる制限はありません。問題が発生する場合は、メモリ容量が原因です。
SIZE_MAX
型の最大値である は、 C の任意の単一オブジェクトsize_t
の絶対最大サイズ (ビットを含む C のバイト単位、 >= 8) です。CHAR_BIT