Сообщение об ошибке: «Неверная контрольная сумма для освобожденного объекта - объект, вероятно, был изменен после освобождения».
Это функция, которая доставляет мне неприятности. npart и parts - глобальные переменные. npart - это int, а parts - массив структур (см. объявление ниже).
typedef struct {
int bSites;
int rotState; // Direction
int pos[2]; // Array index and layer
} Molecule;
Molecule *parts;
Здесь я привел частное к int, чтобы усечь десятичные разряды.
void printXYZ() {
fprintf(fp, "%d\n\n", npart);
for (int i = 0; i < npart; i++){
char type = ((int) xyz[i][0]) == 3 ? 'S' : 'O';
double x, y, z;
z = parts[i].pos[0];
y = ((int) parts[i].pos[1] / size) * 1.73205080757 / 2.0;
if (((int) parts[i].pos[1] / size) % 2 == 0)
x = (double)(parts[i].pos[1] % size);
else
x = ((double)(parts[i].pos[1] % size)) / 2.0;
printf("%c\t%f\t%f\t%f\n", type, x, y, z);
fprintf(fp, "%c\t%f\t%f\t%f\n", type, x, y, z);
}
}
Я выделяю память для массива частей и вызываю в main функцию printXYZ ():
parts = (Molecule*) malloc(npart * sizeof(Molecule));
Пожалуйста помоги!
Я не вижу в этой функции ничего, что могло бы вызвать эту ошибку. У вас, вероятно, есть неопределенное поведение где-то еще в вашей программе, и это повреждает кучу.
Это ничего не должно исправить.
Где код, который вызывает free()
?
Да, он исправил это на секунду, а затем вернулся к ошибке. Я новичок в toC, поэтому не уверен, для чего мне нужен free ().
Примечание: вместо parts = (Molecule*) malloc(npart * sizeof(Molecule));
рассмотрите parts = malloc(sizeof *parts * npart);
. Легче правильно кодировать, проверять и поддерживать. Маловероятно, что причина вашей нынешней проблемы. минимальный воспроизводимый пример поможет.
Нет необходимости ставить
(int)
передparts[i].pos[1]
, поскольку он объявлен какint
.