我想问一下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];
};
SIZE_MAX
,它是size_t
类型的最大值,是 C 中任何单个对象的绝对最大大小(以 C 字节为单位,其中有CHAR_BIT
位,>= 8)。
这取决于您是否在heap
或上创建结构的实例stack
。如果您定义一个指向对象的指针并在heap
through上分配malloc
,那么它取决于您系统的可用内存。
如果您将堆栈上的对象实例定义为struct MyDocument mydoc;
,那么这必然会失败,因为您的系统不会有这么大的堆栈值。
建议声明str
为指针 iechar *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
为对象定义 a,则可以分配对象,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 的大小有关,而不与结构内声明的变量数量有关。编译器不会有任何限制,如果出现问题,那将是由于内存容量问题。
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);