簡體   English   中英

動態分配結構數組

[英]Dynamically allocating an array of a struct

我在用C處理malloc時遇到了困難,尤其是在分配結構數組時。 我有一個程序,該程序基本上將所有文件名和文件大小存儲在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()的函數來獲取靜態分配的大小。

struct fileStruct fileobjarray[totalfiles];

fileobjarray是一個VLA數組,其大小為fileStruct結構的總文件數。 要使用malloc進行分配,我們可以編寫:

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

我們將為totalfiles元素數組分配內存,每個元素的sizeof(*fileobjarray) = sizeof(struct fileStruct)大小。 有時, calloc在C中是更可取的調用,因為它可以(在某些平台上)防止溢出:

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM