所以这是一个真正的初学者问题,但我完全迷失了。我正在尝试在文件夹中生成文件名字符串的数组,以便随后可以遍历每个文件并提取一些信息。因为文件的数量和文件名的长度不固定,所以我需要动态分配数组。到目前为止,这是代码,它从文件夹获取文件名,但是在尝试将名称分配给数组时出错。
int main(int argc, char* argv[])
{
size_t alen;
//input argument is folder path
char src[6], dest[512];
strcpy(src, "*.log");
strcpy(dest, argv[1]);
strcat(dest, src);
int fcount = 0;
char** lnames;
WIN32_FIND_DATA FindFileData;
HANDLE hFind;
hFind = FindFirstFile(dest, &FindFileData);
while (hFind != INVALID_HANDLE_VALUE)
{
alen = strlen(FindFileData.cFileName);
*lnames = (char*)malloc(sizeof(char)*alen);
lnames[fcount] = FindFileData.cFileName;
fcount++;
if (!FindNextFile(hFind, &FindFileData))
{
FindClose(hFind);
hFind = INVALID_HANDLE_VALUE;
}
}
return(0);
}
错误是“正在使用变量'lnames'而不进行初始化”。但这不是malloc应该做什么吗?我想到的一种前进方式是使用相同的代码来计算文件数,然后执行以下操作:
char *lnames[fcount];
但是[]值必须是一个常量,它不会是fcount,所以我很困惑。任何帮助将不胜感激。
最佳答案
不,您的malloc()
调用将初始化*lnames
,而不是lnames
。为此,它使用了lnames
的值,该值实际上尚未初始化。
您还需要为lnames
数组分配一些空间。每次添加文件名时,它都需要变长。
出于效率方面的考虑,您不希望每次都分批进行此操作,但这是一个不错的开始:
添加一个变量,该变量计算到目前为止您拥有的名字数:
int numnames = 0;
靠近顶部。
更改
lnames
的声明以对其进行初始化:char** lnames = NULL
每次您要添加新名称时
numnames++;
lnames = realloc(lnames, numnames * sizeof (char *));
与其在
malloc()
中存储您的*lnames
ed字符串(不要转换malloc!的结果),请使用lnames[numnames - 1]
。您还应该检查错误(
malloc()
和realloc()
可能会失败),但这将是一个好的开始。我故意不给您程序的完整“完美”编辑版本,以便给读者一些练习(对初学者来说是好方法;-)