Другие языки программирования и технологии

[C++] Программа крашится если тип данных LPSTR

Здравствуйте, есть код, объясните, почему программа крашится во втором случае, где используется LPSTR?

#include
typedef char* LPSTR;

void main()
{
// Работает
char szName[128] = "Ivan";
strcat(szName, " Ivanov");
std::cout << "szName: " << szName<< std::endl;

// Не работает
LPSTR lpName = (LPSTR)"Ivan";
strcat(lpName, " Ivanov");
std::cout << "lpName: " << lpName << std::endl;
return;
}
LPSTR lpName = (LPSTR)"Ivan"; объявляет указатель и инициализирует его адресом строковой константы
strcat(lpName, " Ivanov"); пытается записать в секцию констант информацию, получает ошибку доступа
Сергей Гоян
Сергей Гоян
71 585
Лучший ответ
Артур Пиражков как можно фиксануть без массива?
Артур Пиражков я указатели знаю, но про char* плохо понимаю
У тебя на Титанике плывут 2208 человек, а вместимость шлюпок 1178. Вот твоя прога это Титаник.
Память надо выделить млять, чего непонятного? На вот тебе кусок кода:
#include <windows.h>
#include <iostream>
using namespace std;
typedef char* LPSTR;
int main()
{
// Работает
char szName[128] = "Ivan";
strcat(szName, " Ivanov");
cout << "szName: " << szName<< std::endl;
cin.get();
//Тоже работает
cin.ignore();
LPSTR lpName = new char[256];
strcpy(lpName, (LPSTR)"Ivan");
strcat(lpName, " Ivanov");
cout << "lpName: " << lpName << std::endl;
delete[] lpName;
cin.get();
return 0;
}
Али Хисориев
Али Хисориев
57 115
LPSTR значит Long Pointer to a STR - указатель на строку типа char (указатель на байт в памяти).

то есть LPSTR это char*

"когда пишем строку то она храниться имея тип" const char* (LPCSTR в терминах winapi). Строка хранится в области не изменяемых данных (типа read-only), вот почему это const. А ты её хочешь изменить.

По этому нужно выделять память, как в ответе выше.

Я хочу дать совет. Подобные строки (char * str = new char[123];) нужны только если необходима динамическая строка.
Операция new замедляет работу. Это будет заметно если нужно будет обрабатывать большой объём данных.
Использование простого буфера, как в первом примере, даст лучшую скорость.
Артур Пиражков Спасибо огромное за разъяснение! Если бы мог дать два лучших ответа, выбрал бы ваш, уж простите, пообещал другому (
где ошибка?
Артур Пиражков исключение в strcat(lpName, " Ivanov");

Похожие вопросы