c - 结构中数组和结构数组的动态内存分配

标签 c arrays memory-management struct

我是 C 的新手..我正在尝试了解动态内存分配在结构和数组的情况下是如何工作的..所以例如我有这样的代码..

struct Person
{
    int id;
    char *name;
    char *place;
};

struct Database
{ 
    struct Person *data_rows;
};

我想为字符数组 name 和 place.. 以及 struct data_rows 数组动态分配内存.. 将它们的大小作为输入.. 那么理想情况下分配的顺序和正确的语法应该是什么?谢谢。

最佳答案

好吧,“显然”您需要先填写“struct Database”:

struct Database MyDatabase;

MyDatabase.data_rows=malloc(sizeof(MyDatabase.data_rows[0])*NumberOfPeople);

忽略我没有检查 malloc() 是否失败的事实,这将为您提供一个“struct Person”数组,所有这些都未初始化。因此,您很可能想要初始化它们:

int i;
for (i=0; i<NumberOfPeople; i++)
{
   struct Person* MyPerson;

   MyPerson=&MyDatabase.data_rows[i];
   MyPerson->id=i;
   MyPerson->name=malloc(...);
   /* Do something to store the name in MyPerson->name */
   MyPerson->place=malloc(...);
   /* Do something to store the place in MyPerson->name */
}

现在,这里的问题是我放在 malloc 上的“...”。如果您使用固定大小,这很容易,但是您可以将您的结构声明为类似

struct Person
{
    int id;
    char name[100];
    char place[200];
};

基本上,我只是不知道名称的长度应该是多少,因此我只是将其键入“...”。

此外,我只是猜测“id”可能是什么。使用数组索引实际上有点毫无意义:-)

当然,您不必现在全部完成。您可以只将名称和指针设置为 NULL 并在以后填充它们,例如当您从文件中读取数据时,或者您打算做的任何事情。或者,如果您确信您的代码始终“知道”哪些字段已初始化,哪些字段未初始化,则您可以根本不在此处对其进行初始化。

关于c - 结构中数组和结构数组的动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11382890/

相关文章:

c++ - 如何在 Linux 下为 C/C++ 中的计时器设置亲和性?

ios - 避免类对象数组中的重复 Swift 3

objective-c - 关于 NSAutoreleasePool 的概念问题

C 参数定义问题

c - 尽管看起来很简单,但是这个c程序的输出对我来说却令人困惑

JavaScript; n维数组创建

arrays - Fortran中多维数组的线性索引

c++ - 静态分配的数据结构

MySQL不释放内存

c - 以下程序中 "fflush(stdin)"的确切含义是什么?