所以这是一个真正的初学者问题,但我完全迷失了。我正在尝试在文件夹中生成文件名字符串的数组,以便随后可以遍历每个文件并提取一些信息。因为文件的数量和文件名的长度不固定,所以我需要动态分配数组。到目前为止,这是代码,它从文件夹获取文件名,但是在尝试将名称分配给数组时出错。

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()可能会失败),但这将是一个好的开始。

我故意不给您程序的完整“完美”编辑版本,以便给读者一些练习(对初学者来说是好方法;-)

10-08 14:46