#include <iostream>
#include <cstring>
using namespace std;
char slot_desc[] = {'a', 'b', 'c', 'd', 'f', 'e', 0, 0, 0, 0, 0};
typedef struct SlotInfo
{
char slotDescription[10];
}SLOT;
struct GeneralSlot
{
SLOT *SlotInf;
};
GeneralSlot *Slot1;
int main(int argc, char* argv[])
{
Slot1->SlotInf = NULL;
memmove(Slot1->SlotInf->slotDescription, slot_desc, 5);
return 0;
}
В данном коде получаю Ошибка сегментирования (сделан дамп памяти). Компилирую под Linux. Что я делаю не так или чего-то не понимаю с указателями? При запуске от имени суперпользователя ошибку не выдает, но все равно копирование не выполняется. Подскажите, пожалуйста, в чем ошибка.
Вы совершаете одну и ту же ошибку дважды.
В этом предложении объявлен указатель в глобальном пространстве имен
GeneralSlot *Slot1;
Компилятор инициализирует этот указатель нулем. Фактически это объявление эквивалентно объявлению
GeneralSlot *Slot1 = NULL;
То есть данный указатель не указывает ни на какой реальный объект типа GeneralSlot
. Поэтому попытка разыменовать такой указатель в предложении
Slot1->SlotInf = NULL;
ведет к неопределенному поведению программы.
Даже если бы указатель Slot1
указывал бы на реальный объект, тем не менее вы повторяете предыдущую ошибку, инициализировав уже другой указатель Slot1->SlotInf
этого объекта нулем, и пытаясь что-то записать в память по нулевому адресу
memmove(Slot1->SlotInf->slotDescription, slot_desc, 5);
Вам надо, чтобы оба указателя указывали на реальные объекты. Вы могли бы написать, к примеру,
// ...
GeneralSlot *Slot1;
int main(int argc, char* argv[])
{
Slot1 = new GeneralSlot;
Slot1->SlotInf = new SLOT;
memmove(Slot1->SlotInf->slotDescription, slot_desc, 5);
// ...
delete Slot1->SlotInf;
delete Slot1;
return 0;
}
Итак, глобальная переменная
GeneralSlot *Slot1;
т.е. инициализированная нулем. После чего
int main(int argc, char* argv[])
{
Slot1->SlotInf = NULL;
И куда вы записываете этот NULL
? В NULL
?
Вот и получаете то, что получаете...
Выделите память для GeneralSlot
, на которую будет указывать Slot1
.
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Пытаюсь явно подключить dll библиотеки в свой c++ проект, вычитал, что делается это по такому принципу:
ЗдравствуйтеНе получается использовать Protocol Buffers в VS 2017 (Debug x86)
Добрый день, помогите разобраться, выдает ошибку - error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second: [-Werror] String...
Решил тут попробовать написать онлайн-чат с использованием web-сокетов и как раз наткнулся на интересное видео (https://wwwyoutube