c linux stat参数指向未初始化的字节?

c linux stat参数指向未初始化的字节?,c,linux,error-handling,valgrind,stat,C,Linux,Error Handling,Valgrind,Stat,我有一个循环检查文件的修改时间,以便对其执行I/o。 我正在使用stat命令。Valgrind抛出未初始化字节的错误消息。。到底怎么了?在将文件作为参数传递给它之前,我已经确保文件名列表不是空的,并且文件存在,但是错误仍然存在 for (i = 0; i < fcount; i++) { if (modTimeList[i] == 0) { int statret = 0; if(fileNameList[i]!=NULL) stat

我有一个循环检查文件的修改时间,以便对其执行I/o。 我正在使用stat命令。Valgrind抛出未初始化字节的错误消息。。到底怎么了?在将文件作为参数传递给它之前,我已经确保文件名列表不是空的,并且文件存在,但是错误仍然存在

for (i = 0; i < fcount; i++) {
    if (modTimeList[i] == 0) {
        int statret = 0;
        if(fileNameList[i]!=NULL)
        statret = stat(fileNameList[i], &file_stat);  // error 
        if (statret == -1) {
            printf(" stat error at %d", i);
        } else {
            modTimeList[i] = file_stat.st_mtime;
            // process
        }
    } else {
        int statret2 = 0;
        if(fileNameList[i]!=NULL)
        statret2 = stat(fileNameList[i], &file_stat); // error
        if (statret2 == -1) {
            printf(" stat error at %d", i);
        } else {
            if (modTimeList[i] < file_stat.st_mtime) {
                // process
            }
        }

    }

}
减退

char fileNameList[100][256];
我正在像这样初始化文件名

sprintf(inputPath, "find -name %s*.ext", filename);
        fpop = popen(inputPath, "r");
        while (fgets(inputPath, sizeof(inputPath) - 1, fpop) != NULL) {
            strcpy(fileNameList[fcount], trimwhitespace(inputPath));
            fcount++;
        }
        pclose(fpop);

如果您没有首先初始化
文件名
数组,其内容将不是零,而是其他内容(很多时候它是0xCC,但在不同的系统/arch/等上可能有所不同)。

如果您没有首先初始化
文件名
数组,其内容将不是零,而是其他内容(很多时候它是0xCC,但在不同的系统/arch/等上可能会有所不同。)

因为
文件名列表
声明为:

char fileNameList[100][256];
if(fileNameList[i]!=NULL)
将始终为true,因为
fileNameList[i]
不是空指针。您应该将检查更改为:

if ('\0' != *fileNameList[i]) /* Check if empty string. */
但是,为了使其工作,您需要初始化
fileNameList

char fileNameList[100][256] = { { 0 } };

As
文件名列表
声明为:

char fileNameList[100][256];
if(fileNameList[i]!=NULL)
将始终为true,因为
fileNameList[i]
不是空指针。您应该将检查更改为:

if ('\0' != *fileNameList[i]) /* Check if empty string. */
但是,为了使其工作,您需要初始化
fileNameList

char fileNameList[100][256] = { { 0 } };

仅仅因为
fileNameList[i]
处的条目不为空并不意味着它已初始化。例如,
char*fileNameList[10];
将包含(随机)非空指针,因为它们尚未初始化。您可以演示如何声明和填充
fileNameList
吗?如果我在fileNameList循环的开始处执行printf,则值将签出。您可以发布更多代码吗?声明和填充
fileNameList
并分配
fcount
,仅仅因为
fileNameList[i]
处的ry不为NULL并不意味着它已初始化。例如,
char*fileNameList[10];
将包含(随机)非空指针,因为它们尚未初始化。您能演示如何声明和填充
fileNameList
吗?如果我在fileNameList循环的开始处进行printf,值将被签出。您能发布更多代码吗?
fileNameList
的声明和填充以及
fcount
的赋值?我不明白。首先填充文件名数组,然后将文件名传递给stat命令。您是说我必须在使用名称初始化之前将其初始化为零吗?错误在运行时发生否,如果您已经填充了,则可以。可能有一些单元格您没有指定值?我不明白。文件名是首先填充ray,然后将文件名传递给stat命令。你是说我必须在使用名称初始化之前将其初始化为零吗?错误在运行时发生否,如果你已经填充了,则没有问题。可能有一些单元格没有指定值?感谢hmjd,这非常有帮助。感谢hmjd,w这很有帮助。