c - 动态分配结构的数组
问题描述
我很难在 C 中处理 malloc,尤其是在分配结构数组时。我有一个程序,它基本上将所有文件名和文件大小存储在一个结构数组中。我让我的程序在没有使用 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++;
}
}
如您所见,我创建了一个名为 getnumberofiles() 的函数来获取静态分配的大小。
解决方案
struct fileStruct fileobjarray[totalfiles];
fileobjarray 是一个VLA数组,大小为 fileStruct 结构的 totalfiles。要使用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);
}
推荐阅读
- php - 一些文件使用 POST 方法破坏表单
- excel - 当单元格值更改时,如何为一系列行添加粗底边框?
- pickle - 加载 XGBoost 模型:ModuleNotFoundError:没有名为“sklearn.preprocessing._label”的模块
- python - 如何在 Django 中处理多文件输入字段
- python - Python 3.7 psycopg2 - Xcode 错误“错误:命令‘gcc’失败,退出状态为 1”
- python - 使用 Python 通过 Mailgun 提交变量时出错
- mysql - 在特定事件之前计数事件
- bash - 如何使用 alt-left 和 alt-right 在 bash 中实现“后退”和“前进”?
- r - R 空间 - 边界图
- google-maps - Google API 发票异常增加