动态分配结构的数组

时间:2018-05-16 21:23:30

标签: c malloc

我很难在C中处理malloc,特别是在分配struct数组时。我有一个程序,基本上存储所有文件名和文件大小的struct数组。我让我的程序在不使用malloc的情况下运行,但我真的不喜欢这种编程方式。在我的程序中,我可以使用malloc获得任何帮助吗?

int getNumberOfFiles(char *path)
{
 int totalfiles = 0;
 DIR *d;
 struct dirent *dir;
 struct stat cstat;
 d = opendir(path);
 while(( dir = readdir(d)) != NULL) {
     totalfiles++;
}
return totalfiles;
}

int main()
{

      int totalfiles = getNumberOfFiles(".");
      int i =0;
      DIR *d;
      struct dirent *dir; 
      d = opendir(".");
      struct fileStruct fileobjarray[totalfiles];
      struct stat mystat;

       while(( dir = readdir(d)) != NULL) {
        fileobjarray[i].filesize=mystat.st_size;
        strcpy (fileobjarray[i].filename ,dir->d_name );
        i++;
      }

}

正如您所看到的,我创建了一个名为getnumberoffiles()的函数来获取静态分配的大小。

1 个答案:

答案 0 :(得分:0)

struct fileStruct fileobjarray[totalfiles];

fileobjarray是一个VLA数组,其大小总数为fileStruct结构。要使用malloc分配,我们可以写:

struct fileStruct *fileobjarray = malloc(totalfiles * sizeof(*fileobjarray));

我们将为totalfiles元素数组分配内存,每个元素的大小为sizeof(*fileobjarray) = sizeof(struct fileStruct)。有时{C}更适合使用calloc,因为它可以保护(在某些平台上)不受溢出:

struct fileStruct *fileobjarray = calloc(totalfiles, sizeof(*fileobjarray));

请记住free()

int getNumberOfFiles(char *path)
{
 int totalfiles = 0;
 DIR *d;
 struct dirent *dir;
 struct stat cstat;
 d = opendir(path);
 while(( dir = readdir(d)) != NULL) {
     totalfiles++;
}
return totalfiles;
}

int main()
{

      int totalfiles = getNumberOfFiles(".");
      int i =0;
      DIR *d;
      struct dirent *dir; 
      d = opendir(".");
      struct fileStruct *fileobjarray = calloc(totalfiles, sizeof(*fileobjarray));
      if (fileobjarray == NULL) {
            fprintf(stderr, "Error allocating memory!\n");
            return -1;
      }
      struct stat mystat;

      while(( dir = readdir(d)) != NULL) {
        fileobjarray[i].filesize=mystat.st_size;
        strcpy (fileobjarray[i].filename ,dir->d_name );
        i++;
      }
      free(fileobjarray);
}