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

SIZE_MAX,它是size_t类型的最大值,是 C 中任何单个对象的绝对最大大小(以 C 字节为单位,其中有CHAR_BIT位,>= 8)。

于 2013-03-22T02:13:09.657 回答
1

这取决于您是否在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
于 2013-03-22T01:52:37.713 回答
1

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

于 2013-03-22T01:53:03.233 回答
1

4MB 对于堆栈来说可能太大了。分配您strheap.

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 回答