我有一個循環檢查文件的修改時間來執行它的I/O。 我正在使用stat命令。 Valgrind拋出未初始化字節的錯誤消息..只是出了什麼問題?我已經確保文件名列表不爲空,並且在將它們作爲參數傳遞給它之前存在這些文件,但錯誤仍然存在。c linux stat param指向未初始化的字節?
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
}
}
}
}
錯誤消息
==5153== Syscall param stat64(file_name) points to uninitialised byte(s)
==5153== at 0x40007F2: ??? (in /lib/ld-2.7.so)
==5153== by 0x804992B: stat (in /home/)
==5153== by 0x8049559: checkForFiles (in /home)
==5153== by 0x804983F: main (in /home)
==5153== Address 0xbe9271d0 is on thread 1's stack
==5153== Uninitialised value was created by a stack allocation
==5153== at 0x804924C: checkForFiles (in /home/)
==5153==
Decleration
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);
只是因爲在'fileNameList進入[我]'不爲空呢並不意味着它被初始化。例如,'char * fileNameList [10];'將包含(隨機)非空指針,因爲它們尚未初始化。你能說明'fileNameList'是如何聲明和填充的嗎? – hmjd 2012-02-28 11:31:09
如果我在文件名列表的循環開始處執行printf,則會檢出值。 – 2012-02-28 11:34:53
你能發表更多的代碼嗎? 'fileNameList'的聲明和填充以及'fcount'的賦值? – hmjd 2012-02-28 11:38:29