0

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

4 に答える 4

1

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);
于 2013-03-22T01:56:41.873 に答える
1

heapまたはで構造のインスタンスを作成するかどうかによって異なりますstack。オブジェクトへのポインタを定義してheapthroughmallocに割り当てる場合、システムの使用可能なメモリに依存します。

スタック上のオブジェクトのインスタンスを として定義する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
};

この変更により、オブジェクトを作成する場所が か かは問題になりませstackheap。オブジェクトにを定義している場合は、以下の例に示すように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
于 2013-03-22T01:52:37.713 に答える
1

ここで問題は、構造内で宣言された変数の数ではなく、文字列 str のサイズに関連付けられています。コンパイラによる制限はありません。問題が発生する場合は、メモリ容量が原因です。

于 2013-03-22T01:53:03.233 に答える
1

SIZE_MAX型の最大値である は、 C の任意の単一オブジェクトsize_tの絶対最大サイズ (ビットを含む C のバイト単位、 >= 8) です。CHAR_BIT

于 2013-03-22T02:13:09.657 に答える