繁体   English   中英

在数组中找不到导致访问冲突的原因

[英]Can't find what's causing access violation in array

!!!我必须坚持使用这些功能,因为我不允许使用任何不同的功能!

稍微解释一下我需要做什么:用户输入搜索目录,然后如果没有找到任何错误消息,则会弹出错误消息。 如果找到某些东西,我会创建一个包含一行的数组,因为至少找到了一个文件,并且它会保存找到的文件的名称。 然后,如果 FindNextFIle 找到任何东西,我将一行添加到现有数组,并且这一新行保存新找到的文件名。

First output is direct output from the function and the second one is test output of the array to be sure that it worked correctly. 然而,说 memory 访问被违反是行不通的,所以我不能进一步工作。

它无法正常工作的原因可能有两个:

  1. 新行添加不正确
  2. 不正确的打印数组 function

这是main()

system("chcp 1251");
    
    drtctrAr drctr;
    drctr = createDAr();

    WIN32_FIND_DATA FindFileData;
    HANDLE hf;

    hf = FindFirstFile(drctr.str, &FindFileData);
    while (hf == INVALID_HANDLE_VALUE)
    {
        printf("Error opening files or no files found!\n Try changing the search directory or correct your input!\n");
        return 1;

        break;
    }
    
    StringArray fileNames;
    int len;
    fileNames.str = (wchar_t**)malloc(sizeof(wchar_t*) * fileNames.rows);
    
    len = wcslen(FindFileData.cFileName)+1;
    fileNames.sym = (wchar_t*)malloc(sizeof(wchar_t) * len);
    wcscpy_s(fileNames.sym, len, FindFileData.cFileName);

    while (FindNextFile(hf, &FindFileData) != 0)
    {
        printf("Found file: %ls", FindFileData.cFileName);
        printf("\n");

        fileNames.rows++;

        fileNames.str = (wchar_t**)realloc(fileNames.str, sizeof(wchar_t*) * (fileNames.rows));
        int len = wcslen(FindFileData.cFileName) + 1;
        fileNames.str[fileNames.rows-1] = (wchar_t*)malloc(sizeof(wchar_t) * len);
        wcscpy_s(fileNames.str[fileNames.rows-1], len, FindFileData.cFileName);
    }
    FindClose(hf);
    freeDAr(drctr);

    printSA(fileNames);
    filterSA(fileNames);
    freeSA(fileNames);

    system("pause");
    return 0;

这是单独的.cpp中的打印 function :

void printSA(StringArray arr)
{
    printf("...........................\n");
    for (int i = 0; i < arr.rows; i++)
    {
        for(int j=0;j<arr.sym[i];j++)
            printf("Current file: %ls", arr.str[i][j]);
        printf("\n");
    }
}

而数组结构本身,忘记添加它:

struct StringArray
{
    wchar_t** str = NULL;
    wchar_t* sym = NULL;
    int rows = 1;
}; 

我遗憾地提到了这两个可能的原因,但这并不意味着这些是正确的猜测,在分配数组的一开始就可能是错误的

fileNames.str = (wchar_t**)malloc(sizeof(wchar_t*) * fileNames.rows); len = wcslen(FindFileData.cFileName)+1; fileNames.sym = (wchar_t*)malloc(sizeof(wchar_t) * len); wcscpy_s(fileNames.sym, len, FindFileData.cFileName);

此问题存在于上述行中。 您为str分配 memory 但您没有为wchar_t*类型的*str / str[0]分配 memory 。 然后将文件名复制到fileNames.sym而不是fileNames.str[0] ,因此您首先不会发现错误。 然后,如果找到第二个文件,则为fileNames.str[1]分配 memory 并将文件名复制到其中。 这部分是正确的。

因此,当您尝试访问fileNames.str[0]的内容时会发生访问冲突异常,因为它是未分配的 memory。 如果您打印fileNames.str[1] ,它将成功。

以下是基于您提供的代码的修改版本。 这个对我有用。 你可以试一试。

#include <stdio.h>
#include <windows.h>

typedef struct StringArray
{
    wchar_t** str;
    int rows;
}StringArray;

void printSA(StringArray arr)
{
    printf("...........................\n");
    for (int i = 0; i < arr.rows; i++)
    {
        printf("Current file: %ls", arr.str[i]);
        printf("\n");
    }
}

int main()
{
    system("chcp 1251");

    WIN32_FIND_DATA FindFileData;
    HANDLE hf;

    hf = FindFirstFile(L"D:\\*.txt", &FindFileData);
    while (hf == INVALID_HANDLE_VALUE)
    {
        printf("Error opening files or no files found!\n Try changing the search directory or correct your input!\n");
        return 1;

        break;
    }

    StringArray fileNames;
    fileNames.rows = 1;
    int len;
    fileNames.str = (wchar_t**)malloc(sizeof(wchar_t*) * fileNames.rows);

    len = wcslen(FindFileData.cFileName) + 1;

    fileNames.str[fileNames.rows - 1] = (wchar_t*)malloc(sizeof(wchar_t) * len);
    wcscpy_s(fileNames.str[fileNames.rows - 1], len, FindFileData.cFileName);

    while (FindNextFile(hf, &FindFileData) != 0)
    {
        printf("Found file: %ls", FindFileData.cFileName);
        printf("\n");

        fileNames.rows++;

        fileNames.str = (wchar_t**)realloc(fileNames.str, sizeof(wchar_t*) * (fileNames.rows));
        int len = wcslen(FindFileData.cFileName) + 1;
        fileNames.str[fileNames.rows - 1] = (wchar_t*)malloc(sizeof(wchar_t) * len);
        wcscpy_s(fileNames.str[fileNames.rows - 1], len, FindFileData.cFileName);
    }
    FindClose(hf);

    printSA(fileNames);

    // TODO: Free pointers
    // ...

    system("pause");
    return 0;
}

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM