C中的结构限制

时间:2013-03-22 01:49:41

标签: c

我想问一下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 个答案:

答案 0 :(得分:1)

这取决于您是在heap还是stack创建结构的实例。如果您定义指向对象的指针并在heapmalloc上进行分配,则它取决于系统的可用内存。

如果您将堆栈上的对象实例定义为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
};

通过此更改,您在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

答案 1 :(得分:1)

此处您的问题与字符串str的大小无关,而与结构内声明的变量数量无关。编译器不会有任何限制,如果出现任何问题,将由于内存容量。

答案 2 :(得分: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);

答案 3 :(得分:1)

SIZE_MAXsize_t类型的最大值,是绝对最大大小(以C的字节为单位,其中包含CHAR_BIT位,其中&gt; = 8 )C中的任何单个对象。