VS2010 中的堆错误

Heap error in VS2010

本文关键字:错误 VS2010      更新时间:2023-10-16

我正在尝试实现该程序,该程序可识别Windows文件属性。我有一个代码,但有时,在主块中传递返回后,我会收到堆错误。感谢您的关注和帮助!

#include "stdafx.h"
#include <Windows.h>
#include <conio.h>
_TCHAR* getStringAttributes(int value, _TCHAR* str[])
{
    DWORD d = GetFileAttributes(str[value]);
    _TCHAR* temp;
    switch(d)
    {
        case 2048: temp = L"Compressedn"; break;
        case 32: temp = L"Archiven"; break;
        case 16: temp = L"Directoryn"; break;
        case 16384: temp = L"Encryptedn"; break;
        case 2: temp = L"Hiddenn"; break;
        case 128: temp = L"Normaln"; break;
        case 1: temp = L"Readonlyn"; break;
        case 4: temp = L"Systemn"; break;
        case 256: temp = L"Temporaryn"; break;
        default: temp = L"Error or unsupported attributen"; break;
    }
    return temp;
}
int _tmain(int argc, _TCHAR* argv[])
{
    _TCHAR* attString = new _TCHAR();
    char* ynAnswer = new char();
    if(argv[1] == NULL)
    {
        printf("%sn","You didn't type file path. Try again?[Y/N]");
        gets_s(ynAnswer,10);
        if(*ynAnswer == 'y' || *ynAnswer == 'Y')
        {
            printf("%sn","Type in a path to the file");
            argv[1] = new _TCHAR();
            _getws(argv[1]);
            if(argv[1] != L"")
            {
                printf("%s","Attribute: ");
                attString = getStringAttributes(1,argv);
                _tprintf(attString);
                printf("%s","forn");
                _tprintf(argv[1]);
            }
        }
    }
    else
    {
        printf("%s","Attribute: ");
        attString = getStringAttributes(1,argv);
        _tprintf(attString);
    }
    printf("%s","Goodbye");
    getch();
    delete[] ynAnswer;
    delete[] attString;
    return 0;
}

您将整个字符串输入到 1 或 2 个字节的字符串中。这些分配:

_TCHAR* attString = new _TCHAR();
char* ynAnswer = new char();

仅分配 1 个项目数组。

它应该是:

_TCHAR* attString = new _TCHAR[MAX_SIZE];
char* ynAnswer = new char[MAX_SIZE];

MAX_SIZE必须哔哔声作为宏。

更好的是使用:

 wstring attString ;
 string  ynAnswer;
 wcin>> attString;
 cin>>  ynAnswer;

更多的问题是行中的分配:

 argv[1] = new _TCHAR();

除了前面回答的问题之外,在这一行中,argv[1]甚至可能不存在。您应该输入到其他缓冲区。

它可以是这样的:

wstring argv1;
if(argc <2){
   wcin>>argv1;
}else{
   argv1=argv[1]; 
}

现在使用 argv1 而不是 argv[1]

还有一件事:

您正在使用_TCHAR作为WCHAR

使用_TCHAR字符串应为:

_T("some string")

不是:

L"some string" .