Ошибка кучи в VS2010

0

Я пытаюсь реализовать программу, которая распознает атрибуты файла 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"Compressed\n"; break;
        case 32: temp = L"Archive\n"; break;
        case 16: temp = L"Directory\n"; break;
        case 16384: temp = L"Encrypted\n"; break;
        case 2: temp = L"Hidden\n"; break;
        case 128: temp = L"Normal\n"; break;
        case 1: temp = L"Readonly\n"; break;
        case 4: temp = L"System\n"; break;
        case 256: temp = L"Temporary\n"; break;
        default: temp = L"Error or unsupported attribute\n"; break;
    }

    return temp;
}

int _tmain(int argc, _TCHAR* argv[])
{
    _TCHAR* attString = new _TCHAR();
    char* ynAnswer = new char();

    if(argv[1] == NULL)
    {
        printf("%s\n","You didn't type file path. Try again?[Y/N]");
        gets_s(ynAnswer,10);

        if(*ynAnswer == 'y' || *ynAnswer == 'Y')
        {
            printf("%s\n","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","for\n");
                _tprintf(argv[1]);
            }
        }
    }
    else
    {
        printf("%s","Attribute: ");
        attString = getStringAttributes(1,argv);
        _tprintf(attString);
    }

    printf("%s","Goodbye");
    getch();

    delete[] ynAnswer;
    delete[] attString;

    return 0;
}
  • 1
    Вы только выделяете attString и ynAnswer достаточно памяти для одного символа, поэтому вы ynAnswer кучу.
  • 0
    Что мне тогда делать?
Теги:
msdn

1 ответ

1

вы вводите целую строку в строки 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".

Ещё вопросы

Сообщество Overcoder
Наверх
Меню