我想问一下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。如果您定义一个指向对象的指针并在heapthrough上分配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);