Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
gkanyon
0 / 0 / 0
Регистрация: 15.06.2015
Сообщений: 1
#1

Переполнение буфера при поиске WNDDIR - C++

15.06.2015, 13:08. Просмотров 181. Ответов 1
Метки нет (Все метки)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
    string getWNDdir(){
    TCHAR wndbuff[128];
        memset(wndbuff,0,sizeof(TCHAR)*sizeof(wndbuff));
        string strdir="";
        GetWindowsDirectory(wndbuff, sizeof(wndbuff));
        for(int i=0;i<sizeof(wndbuff);i++){
            char c=(char)(wndbuff[i]);
            if(c==(char)0){
                break;}
            strdir+=c;
        }
        return strdir;
    }
Так вылетает с сообщением о переполнении буфера.
Решил костылем - сделал переменную с массивом глобальной у класса
http://www.cyberforum.ru/cpp-beginners/thread2041745.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.06.2015, 13:08
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Переполнение буфера при поиске WNDDIR (C++):

Переполнение буфера
Добрый день! В общем: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; using...

переполнение буфера
Что такое переполнение буфера?

Переполнение буфера
Объясните почему вылетает ошибка и помогите исправить. Зарание спасибо ...

Переполнение буфера
Не могу найти, где у меня ошибка, выдает переполнение буфера, подскажите...

Переполнение буфера
В программе имеется форма и записывается текстовые файлы. Когда она запускается...

1
Max Dark
шКодер самоучка
1890 / 1690 / 834
Регистрация: 09.10.2013
Сообщений: 3,748
Записей в блоге: 6
Завершенные тесты: 2
15.06.2015, 13:36 #2
Лучший ответ Сообщение было отмечено gkanyon как решение

Решение

sizeof не предназначена для определения размеров массивов
оно предназначено для определения размера элемента типа данных
в вашем случае тип - TCHAR[128]
и sizeof возвращает sizeof(TCHAR)*128
если используется UNICODE, то TCHAR == wchar_t(2 байта), иначе просто char(1 байт)
соответственно UNICODE версия будет занимать больше места и в цикле будет попытка прочитать больше символов, чем туда записано
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdexept>
// ANSII version
std::string GetWinDirA() {
    char buff[MAX_PATH];
    if (0 == GetWindowsDirectoryA(buff, MAX_PATH))
        throw std::runtime_error("GetWindowsDirrectory");
    return std::string(buff);
}
 
// UNICODE version
std::wstring GetWinDirW() {
    wchar_t buff[MAX_PATH];
    if (0 == GetWindowsDirectoryW(buff, MAX_PATH))
        throw std::runtime_error("GetWindowsDirrectory");
    return std::wstring(buff);
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2015, 13:36
Привет! Вот еще темы с решениями:

Переполнение буфера
Подскажите, пожалуйста кто-нибудь, в чем беда... Во время выполения программы...

Переполнение буфера! (наверное)
Идет открытие порта звуковой карты, получение битов, запись битов в буфер и...

Переполнение буфера . Что делать ?
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; #include...

Переполнение буфера и его эксплойты
Добрый вечер) Есть такая прога, которая выглядит следующим образом: #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru