我是这个论坛的新手,我希望做对。我的问题如下:我正在编写一个具有以下功能的程序:
void* s_malloc(int _size, int dim){
printf("%d %dn", _size, dim);
char* pointer;
pointer = (char*)malloc(_size * dim);
printf("Malloc eseguita n");
if(pointer == NULL){
ExitFailure(strerror(errno));
}else{
for(int i = 0; i < dim * _size; i++){
pointer[i] = ' ';
}
printf("Allocatan");
return (void*)pointer;
}
return (void*) NULL;
}
我测试了很多这个函数(事实上,我一个月前就写了这个函数,从那以后我用了很多)。我确信这个函数运行良好。然而,在另一个函数中,我使用了"s_malloc",它使崩溃
#define LDTOCAT "C:\Users\admin\logdrstrace\"
void startProcess(){
char* logfile, *logfilefullpath;
int run = TRUE, lenth = 0;
/*
for(int i = 0; i < 16; i ++){
s_malloc(60, 1);
}*/ commented
while(run){
logfile = checkLogFileDirectory();
Sleep(1000);
#ifdef DEBUG_MODE
printf("nValue returned: %sn", logfile);
fflush(stdout);
#endif // DEBUG_MODE
if(strcmp(logfile, NOFILEFOUND) != 0){
run = FALSE;
}
}
lenth = (strlen(LDTOCAT)+strlen(logfile)+1);
#ifdef DEBUG_MODE
printf("Let's go forward allocating memory: size %dn", lenth);
printf("LDTOCAT size: %d, logfile size: %d + 1n", strlen(LDTOCAT), strlen(logfile));
fflush(stdout);
#endif // DEBUG_MODE
logfilefullpath =(char*) s_malloc(lenth, sizeof(char));
#ifdef DEBUG_MODE
printf("Memory created!n");
fflush(stdout);
#endif // DEBUG_MODE
memcpy(logfilefullpath, LDTOCAT, sizeof(LDTOCAT));
#ifdef DEBUG_MODE
printf("Created logfilefullpath with directory: %sn", logfilefullpath);
fflush(stdout);
printf("File found: %sn", strcat(logfilefullpath, logfile));
#endif // DEBUG_MODE
int fd = open(strcat(LDTOCAT, logfile), O_RDONLY);
if(fd <= OK){
ExitFailure(strerror(errno));
}
}
正如你所看到的,在评论的开头有一个for循环。现在我们有三种可能性:1) 如果我编译并运行程序,当它执行在s_malloc中输入的命令"loginfulpath=(char*)s_malloc(lenth,sizeof(char))"时,它在s_mallock函数中失败,当它调用原始malloc时崩溃。有时errno变量设置为"内存不足",但有时会崩溃并停止。2) 如果我在开始时解除循环并且停止条件是"i<15’它像第一点一样崩溃3) 如果我将停止条件‘i<16英尺,神奇的是,它工作得很好。
存在打开目录并查找文件的第三个功能,实际上,正如您在代码中看到的那样,它避免了发现的前两个文件被使用确实如此。和
#define NOFILEFOUND "Nothing"
char* checkLogFileDirectory(){
HANDLE hfile = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA fdata, nullValue;
char* file = NULL;
int counter=0;
while(hfile == INVALID_HANDLE_VALUE){
hfile = FindFirstFileA(LOGDIR, &nullValue);
}
#ifdef DEBUG_MODE
printf("-FileFound: %sn", nullValue.cFileName);
#endif // DEBUG_MODE
while(FindNextFile(hfile, &fdata) && counter != 2){
#ifdef DEBUG_MODE
printf("-File found: %sn", fdata.cFileName);
#endif // DEBUG_MODE
if(counter == 1){
#ifdef DEBUG_MODE
printf("Third file it's my filen");
#endif // DEBUG_MODE
file = s_malloc(strlen(fdata.cFileName), sizeof(char));
memcpy(file, fdata.cFileName, strlen(fdata.cFileName)+1);
if(file == NULL){
ExitFailure("Error reading file");
}
file[strlen(fdata.cFileName)] = ' ';
}
counter ++;
}
#ifdef DEBUG_MODE
printf("n=>File selected: %s", file==NULL | file == "" ? NOFILEFOUND:file);
#endif // DEBUG_MODE
return counter == 2? file : NOFILEFOUND;
}
注意:我打印了所有变量的值,它们都是正确的,我在带有vmware工作站的虚拟机上。我很抱歉我的英语,我希望你能听懂
这是在情况1或2 中崩溃时的输出
-FileFound: .
-File found: ..
-File found: drstrace.calc.exe.00532.0000.log
Third file it's my file
32 1
Malloc eseguita
Allocata
=>File selected: drstrace.calc.exe.00532.0000.log
Value returned: drstrace.calc.exe.00532.0000.log
Let's go forward allocating memory: size 60
LDTOCAT size: 27, logfile size: 32 + 1
60 1
Malloc eseguita
Error: Not enough space!!
谢谢!!
您的分配功能还可以(这是一个有错误检查的calloc
的穷人版本,也许使用calloc
可以节省一些手动代码,并且会更高效)
但在checkLogFileDirectory
中,这个代码是错误的:
file = s_malloc(strlen(fdata.cFileName), sizeof(char));
memcpy(file, fdata.cFileName, strlen(fdata.cFileName)+1);
没有足够的空间用于CCD_ 4(nul终止字符)。您缺少1个字节,这可能会通过未定义的行为破坏应用程序的其余部分(分配15或16个无用块有时会使其"工作",因为它会更改内存布局)。
为什么不这么做:
file = strdup(fdata.cFileName);
此外,正如评论中所指出的,如果你的程序进一步深入,你会在这里遇到一个大问题:
int fd = open(strcat(LDTOCAT, logfile), O_RDONLY);
LDTOCAT
是一个字符串文本,您无法在其上应用strcat
。即使可以,您也没有足够的空间。
HANDLE hfile = INVALID_HANDLE_VALUE;
WIN32_FIND_DATA fdata, nullValue;
while(hfile == INVALID_HANDLE_VALUE)
{
hfile = FindFirstFileA(LOGDIR, &nullValue);
}
请注意,如果出现问题,此循环将永远运行。然后将整个函数放入另一个while
循环中。
如果函数调用有效,那么您第一次就成功了,否则您就无法使用暴力解决问题。
您没有关闭hfile
。本节中还有许多错误。有很多FindFirstFile
的示例和文档可以参考。
你已经有了strcat
,你也应该有strcpy
。strcpy
将在字符串末尾添加null终止符。只需使用标准的malloc
和strcpy
您必须free
和malloc
的分配,因此如果您的函数总是在失败时返回指针和NULL
,则会更简单。
char* checkLogFileDirectory()
{
char* file = NULL;
WIN32_FIND_DATA fdata;
HANDLE hfile = FindFirstFile("C:\Users\admin\logdrstrace\*.log", &fdata);
if(hfile != INVALID_HANDLE_VALUE)
{
do
{
if(strcmp(fdata.cFileName, ".") == 0 || strcmp(fdata.cFileName, "..") == 0)
continue;
int len = strlen(fdata.cFileName);
file = malloc(len + 1);
strcpy(file, fdata.cFileName);
break;
} while(FindNextFile(hfile, &fdata));
FindClose(hfile);
}
return file;
}
int main()
{
char *file = checkLogFileDirectory();
if(file) {
printf("%sn", file);
free(file);
}
return 0;
}