Здравствуйте, есть код, объясните, почему программа крашится во втором случае, где используется 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;
}
Другие языки программирования и технологии
[C++] Программа крашится если тип данных LPSTR
LPSTR lpName = (LPSTR)"Ivan"; объявляет указатель и инициализирует его адресом строковой константы
strcat(lpName, " Ivanov"); пытается записать в секцию констант информацию, получает ошибку доступа
strcat(lpName, " Ivanov"); пытается записать в секцию констант информацию, получает ошибку доступа
Артур Пиражков
как можно фиксануть без массива?
Артур Пиражков
я указатели знаю, но про 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;
}
Память надо выделить млять, чего непонятного? На вот тебе кусок кода:
#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;
}
LPSTR значит Long Pointer to a STR - указатель на строку типа char (указатель на байт в памяти).
то есть LPSTR это char*
"когда пишем строку то она храниться имея тип" const char* (LPCSTR в терминах winapi). Строка хранится в области не изменяемых данных (типа read-only), вот почему это const. А ты её хочешь изменить.
По этому нужно выделять память, как в ответе выше.
Я хочу дать совет. Подобные строки (char * str = new char[123];) нужны только если необходима динамическая строка.
Операция new замедляет работу. Это будет заметно если нужно будет обрабатывать большой объём данных.
Использование простого буфера, как в первом примере, даст лучшую скорость.
то есть LPSTR это char*
"когда пишем строку то она храниться имея тип" const char* (LPCSTR в терминах winapi). Строка хранится в области не изменяемых данных (типа read-only), вот почему это const. А ты её хочешь изменить.
По этому нужно выделять память, как в ответе выше.
Я хочу дать совет. Подобные строки (char * str = new char[123];) нужны только если необходима динамическая строка.
Операция new замедляет работу. Это будет заметно если нужно будет обрабатывать большой объём данных.
Использование простого буфера, как в первом примере, даст лучшую скорость.
Артур Пиражков
Спасибо огромное за разъяснение! Если бы мог дать два лучших ответа, выбрал бы ваш, уж простите, пообещал другому (
где ошибка?
Артур Пиражков
исключение в strcat(lpName, " Ivanov");
Похожие вопросы
- C# почему когда создаю тип данных byte - он его автоматически преобразовывает в тип int?
- Учу C++! Уже знаю: типы данных, циклы. условия, привидения и т. д учу 5дней. вот программа! Как норм за 5 дней?
- C++. Типы данных. Создание типа данных.
- C++ Про выбор типа данных. Int, char и т. д.
- Задача 4. Комбинированный тип данных – записиСоставить программу, в которой разнотипные данные, обрабатываемые паралл
- Программа должна определить тип введённых данных (int или float) Программа должна быть написана на С
- Что имеется ввиду под 4 байтами у типа данных int?(С++)
- Напишите пожалуйста функцию обмена значений двух переменных на си (не c++) для любого типа данных
- Зачем и для чего нужен тип данных bool в C++? Пожалуйста, объясните развёрнутым ответом. Заранее спасибо.
- Есть ли в программировании основные (фундаментальные) типы данных, от которых берут начало другие типы?