Я написал программу Secret Santa, которая будет читать число участников игры, назначать каждого участника одному из других участников случайным образом, следя за тем, чтобы ни один из участников не был назначен себе, и отправлять каждому по электронной почте.
Кажется, что он работает правильно и выдает намеченный результат, но возвращает free(): invalid pointer
в конце выполнения перед прерыванием.Пишу ли я где-то за пределами функции derange()
, которую я не могу найти?Кроме того, моя логика случайного расстройства выглядит хорошо?Кажется, что это хорошо проверяет, но у меня есть подозрение, что это не дает действительно случайное распределение.В основном это учебное упражнение для меня - хотя я надеюсь использовать его во время каникул.Будьте добры, я только начинаю!
РЕДАКТИРОВАТЬ: Исправлен код для более минимального примера.
struct person {
char name[30];
char emailAddress[30];
char secretSanta[30];
};
int main(void) {
int n;
scanf("%d", &n);
struct person * members = (struct person *) malloc(n * sizeof(struct person));
derange(members, n);
free(members);
return 0;
}
void derange(struct person * p, int n) {
srand(time(NULL));
int guesses[n];
int i, j, r;
for(i = 0; i < n; i++) {
r = (rand() % n);
if(r == i) {
i = -1;
// picked its own number, restart loop
} else {
for(j = 0; j < n; j++) {
if(r == guesses[j]) {
i = -1;
guesses[j] = -1;
// number already used, restart main loop
}
}
guesses[i] = r;
for(j = 0; j < 30; j++) {
p[i].secretSanta[j] = p[r].name[j];
}
}
}
}