我想问一下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];
};
答案 0 :(得分:1)
这取决于您是在heap
还是stack
创建结构的实例。如果您定义指向对象的指针并在heap
到malloc
上进行分配,则它取决于系统的可用内存。
如果您将堆栈上的对象实例定义为struct MyDocument mydoc;
,那么这肯定会失败,因为您的系统不会有如此巨大的堆栈值。
建议将str
声明为指针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
答案 1 :(得分:1)
此处您的问题与字符串str的大小无关,而与结构内声明的变量数量无关。编译器不会有任何限制,如果出现任何问题,将由于内存容量。
答案 2 :(得分:1)
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);
答案 3 :(得分:1)
SIZE_MAX
是size_t
类型的最大值,是绝对最大大小(以C的字节为单位,其中包含CHAR_BIT
位,其中&gt; = 8 )C中的任何单个对象。