Ошибка сегментирования (Linux)

440
06 мая 2017, 22:48
#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. Что я делаю не так или чего-то не понимаю с указателями? При запуске от имени суперпользователя ошибку не выдает, но все равно копирование не выполняется. Подскажите, пожалуйста, в чем ошибка.

Answer 1

Вы совершаете одну и ту же ошибку дважды.

В этом предложении объявлен указатель в глобальном пространстве имен

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;
}
Answer 2

Итак, глобальная переменная

GeneralSlot *Slot1;

т.е. инициализированная нулем. После чего

int main(int argc, char* argv[])
{
    Slot1->SlotInf = NULL;

И куда вы записываете этот NULL? В NULL?
Вот и получаете то, что получаете...

Выделите память для GeneralSlot, на которую будет указывать Slot1.

READ ALSO
LoadLibrary возвращает нули

LoadLibrary возвращает нули

Пытаюсь явно подключить dll библиотеки в свой c++ проект, вычитал, что делается это по такому принципу:

200
Компиляция Protocol Buffers в VS 2017

Компиляция Protocol Buffers в VS 2017

ЗдравствуйтеНе получается использовать Protocol Buffers в VS 2017 (Debug x86)

402
разбор json c++ eclips

разбор json c++ eclips

Добрый день, помогите разобраться, выдает ошибку - 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...

236
Как работать с Node.js

Как работать с Node.js

Решил тут попробовать написать онлайн-чат с использованием web-сокетов и как раз наткнулся на интересное видео (https://wwwyoutube

429