Стек вокруг переменной ‘dim’ (не массив) поврежден

Я пытаюсь прочитать из двоичного файла, используя fstream, некоторые данные, которые я ранее там записал.

Проблема в том, что после перехода в конец функции отображается сообщение в теме

Код следующий:

ifstream in("contrib.bin", ios::in | ios::binary );

char *nume, dim;
in.read((char*)&dim, sizeof(int));
nume = new char[dim + 1];
in.read(nume, dim);
nume[dim] = '\0';
double imp;
in.read((char*)&imp, sizeof(double));

delete [] nume;

Теперь я сделал домашнее задание и искал эту проблему, но у других людей, которые сталкивались с этим, были массивы, тогда как моя переменная — простой символ.

Может кто-нибудь указать мне правильное направление, пожалуйста?

2

Решение

Код

char dim;
in.read((char*)&dim, sizeof(int));

определяет 1-байтовый символ, а затем читает sizeof(int) байт (что, вероятно, будет больше, чем 1) в него. Это неверно и может повредить ваш стек.

Если вам нужно прочитать sizeof(int) байты, объявить dim как int, В противном случае измените количество прочитанных байтов на 1. Было бы лучше, если бы вы также использовали sizeof(dim) чтобы убедиться, что вы прочитали столько байтов, сколько вы предоставили для хранения:

in.read((char*)&dim, sizeof(dim));
13

Другие решения

in.read((char*)&dim, sizeof(int)); не является правильным, dim только держит sizeof(char) который один, но вы пытаетесь прочитать sizeof(int) внутрь.

После этого все перчатки сняты.

7

Ну, вы определяете символ, а затем читаете в формате int. Это было бы первым выпуском

char *nume, dim;
in.read((char*)&dim, sizeof(char));
2