c-在堆上创建一个结构数组,为所有成员分配内存



请考虑这个C代码:

我在堆栈上有一个结构数组。此结构有3个固定长度的字符数组。由于它在堆栈上,所以内存都是预先分配的,我不必担心c/mallocfree的问题

#include <stdio.h>
#include <stdio.h>
#include <string.h>
struct memberStruct {
int Field1;
char Name[128];
char Token[128];
char Secret[128];
int Epoch;
int Age;
int Zip;
int Devices;
int Leaves;
};
struct memberStruct members[8192] = { 0 };
void printMember(struct memberStruct *member);
int main() {
printf("size of members: %dn", sizeof(members));
printMember(&members[0]);
struct memberStruct *ptr = &members[1];
printf("member0 is at %pn", ptr);
memcpy(ptr->Name, "Member 1 Name", 32);
printMember(ptr);
printMember(&members[1]);
return 0;
}
void printMember(struct memberStruct *member) {
printf("This is member at %pn", member);
printf("member Name: %s, Age: %d, Zip: %d, Secret: %sn", member->Name, member->Age, member->Zip, member->Secret);
}

我觉得这很方便。但当你运行它时,

$ ./question 
size of members: 3342336 // <-- THIS!
This is member at 0x21030
member Name: , Age: 0, Zip: 0, Secret: 
member0 is at 0x211c8
This is member at 0x211c8
member Name: Member 1 Name, Age: 0, Zip: 0, Secret: 
This is member at 0x211c8
member Name: Member 1 Name, Age: 0, Zip: 0, Secret: 

你可以看到它需要大约3.3MB的内存,在堆栈上有很多,这就引出了一个问题:

有没有办法在堆上创建这个结构数组(为具有固定长度字符数组的成员留出mem(?

您可以使用对malloc的一次调用来创建数组。我相信这也会将每个结构中的三个数组存储在堆中。返回值不是被存储的数据的总大小,而是指针"0"的大小;成员";。试试这个不使用静态变量的:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct memberStruct {
int Field1;
char Name[128];
char Token[128];
char Secret[128];
int Epoch;
int Age;
int Zip;
int Devices;
int Leaves;
};
void printMember(struct memberStruct *member);
int main() {
struct memberStruct* members = (struct memberStruct*)malloc(8192 * sizeof(struct memberStruct));
printf("size of members: %ldn", sizeof(members));
printMember(&members[0]);
struct memberStruct *ptr = &members[1];
printf("member0 is at %pn", ptr);
memcpy(ptr->Name, "Member 1 Name", 32);
printMember(ptr);
printMember(&members[1]);
return 0;
}
void printMember(struct memberStruct *member) {
printf("This is member at %pn", member);
printf("member Name: %s, Age: %d, Zip: %d, Secret: %sn", member->Name, member->Age, member->Zip, member->Secret);
}
size of members: 8
This is member at 0x7f7ba2e68010
member Name: , Age: 0, Zip: 0, Secret: 
member0 is at 0x7f7ba2e681a8
This is member at 0x7f7ba2e681a8
member Name: Member 1 Name, Age: 0, Zip: 0, Secret: 
This is member at 0x7f7ba2e681a8
member Name: Member 1 Name, Age: 0, Zip: 0, Secret:

关于:有没有办法在堆上创建这个结构数组(为具有固定长度字符数组的成员留出mem(

当前,数组是在"文件全局空间"中创建的,而不是在堆栈上创建的。

要在堆栈上创建数组,请执行以下语句:

struct memberStruct members[8192] = { 0 };

必须在函数内部,如main()内部

要在堆上创建数组,请在main():中使用以下语句

struct memberStruct *member = calloc( sizeof( struct memberStruct ), 8192 );

这也会将所有内容初始化为0x00

最新更新