none
Выделение памяти для массива RRS feed

  • Вопрос

  • Здравствуйте. Долго мучился и решил написать. На первом скриншоте обведена часть кода, при реализации которой возникает ошибка, показанная на втором скриншоте. Пытался выделить память под массив LPSTR и видимо неправильно указываю что-то. 

    Если это важно, то мне дали задание (чтобы потренироваться работать с указателями)  сделать лёгкую програмку с двумя окнами, где выделяется память под все переменные. 

    P.S. Не судите за код строго. Сырая писанина.


    8 марта 2017 г. 14:51

Ответы

  • Мда, преобразование результатов c_str в LPSTR с помощью const_cast это конечно изврат высшей степени.

    Как бы то ни было, программа крашится похоже из-за банального выхода за границу массива. Вместо

    for(int i=0;i<=*num;i++)


    напишите 

    for(int i=0;i<*num;i++)


    8 марта 2017 г. 17:59
  • Результат функции c_str нельзя модифицировать (поэтому, собственно, он и константный) , кроме того он действителен только пока существует исходный объект std::string. Данный способ будет работать, пока вы не модифицируете массив символов и не уничтожаете исходную строку. Если вы забудете про это, будет исключение или непредсказуемый результат.

    Правильно делать так: выделить память под массив символов (размер = длина строки + 1) оператором new и скопировать туда символы функцией strncpy (заголовочный файл string.h).

    Добавлено: кстати, функция WritePrivateProfileString вообще-то принимает LPCSTR, так что вы могли ничего не преобразовывать.
    • Изменено VadimTagil 8 марта 2017 г. 19:51 добавлено
    • Помечено в качестве ответа Влад Милоста 9 марта 2017 г. 12:51
    8 марта 2017 г. 19:30

Все ответы

  • Мда, преобразование результатов c_str в LPSTR с помощью const_cast это конечно изврат высшей степени.

    Как бы то ни было, программа крашится похоже из-за банального выхода за границу массива. Вместо

    for(int i=0;i<=*num;i++)


    напишите 

    for(int i=0;i<*num;i++)


    8 марта 2017 г. 17:59
  • Спасибо большое. Помогло. А про LPSTR нам только поверхностно рассказывали вот и справляюсь как могу. Главное - работает. Почти стабильно)

    Был бы признателен если бы вы просветили меня на счёт конвертирования LPSTR в string и обратно. Есть еще какой-нибудь лёгкий и элегантный способ?

    8 марта 2017 г. 19:11
  • Результат функции c_str нельзя модифицировать (поэтому, собственно, он и константный) , кроме того он действителен только пока существует исходный объект std::string. Данный способ будет работать, пока вы не модифицируете массив символов и не уничтожаете исходную строку. Если вы забудете про это, будет исключение или непредсказуемый результат.

    Правильно делать так: выделить память под массив символов (размер = длина строки + 1) оператором new и скопировать туда символы функцией strncpy (заголовочный файл string.h).

    Добавлено: кстати, функция WritePrivateProfileString вообще-то принимает LPCSTR, так что вы могли ничего не преобразовывать.
    • Изменено VadimTagil 8 марта 2017 г. 19:51 добавлено
    • Помечено в качестве ответа Влад Милоста 9 марта 2017 г. 12:51
    8 марта 2017 г. 19:30
  • Ещё раз спасибо огромное! Завтра несу сдавать)
    9 марта 2017 г. 12:51