初始化具有未知数量和未知长度的字符串数组

时间:2015-06-20 15:50:22

标签: c arrays string

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

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不会这样,所以我很困难。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

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

我故意不给你一个完整的“完美”编辑版本的程序,为读者留下一些练习(这对初学者有用; - )