C语言 访问冲突写入位置0x01140000

qhhrdooz  于 2023-04-11  发布在  其他
关注(0)|答案(1)|浏览(146)

我对C语言比较陌生,遇到了一个问题。我想列出给定的目录,搜索所有的文件或子目录,写下文件的名称和最后一次访问的时间。但是每次在sprintf_s()之后,它都会给我Access violation。我想这和我的指针在递归函数中作为参数有关。所以这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<windows.h>
#include<direct.h>
#include<stdbool.h>
#define __STDC_WANT_LIB_EXT1__ 1

bool ListFromDirectory(const char* sDir) {//recursive functions for listing through the directory
    WIN32_FIND_DATA fdFile;
    HANDLE hFind = NULL;

    char sPath[2048];

    //Specify a file mask. *.*
     sprintf_s(sPath, "%s\\*.*", sDir);
    if ((hFind = FindFirstFile(sPath, &fdFile)) == INVALID_HANDLE_VALUE)
    {
        printf("Path not found: [%s]\n", sDir);
        return false;
    }

    do
    {
        //Find first file will always return "."
        //    and ".." as the first two directories.
        if (strcmp(fdFile.cFileName, ".") != 0
            && strcmp(fdFile.cFileName, "..") != 0)
        {
            LPSYSTEMTIME lpSystemTime;

            //Is the entity a File or Folder?
            if (fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                printf("Directory: %s\n", sPath);
                ListFromDirectory(sPath);
            }
            else {
                printf("File: %ls\n", fdFile.cFileName);
                FILETIME localFiletime;
                if (FileTimeToLocalFileTime(&fdFile.ftLastWriteTime, &localFiletime)) {
                    SYSTEMTIME sysTime;
                    if (FileTimeToSystemTime(&localFiletime, &sysTime)) {
                        printf("%ls is last modified at %.2d-%.2d-%4d %.2d:%.2d:%.2d\n",
                            fdFile.cFileName,                            
                            sysTime.wMonth, sysTime.wDay, sysTime.wYear,
                            sysTime.wHour, sysTime.wMinute, sysTime.wSecond);
                    }
                }
            }
        }
    } while (FindNextFile(hFind, &fdFile)); //Find the next file.

    FindClose(hFind);

    return true;
}
int main() {
    char c[12] = "E:\\Windows\\";
    ListFromDirectory(c);
    return 0;
}

sprintf_s()之后的错误:在0x7A85EF8C(ucrtbased.dll)处引发异常:0xC0000005:访问冲突写入位置0x00760000。

8xiog9wr

8xiog9wr1#

您忽略了编译器警告和sprintf_s的手册页,其中指出需要传递缓冲区大小,因此

sprintf_s(sPath, "%s\\*.*", sDir);

应该是

sprintf_s(sPath, sizeof sPath, "%s\\*.*", sDir);

编译器也给出了很多关于你在格式字符串中使用的类型说明符的警告。

相关问题