C 随机错乱内存泄漏
我写了一个秘密的圣诞老人程序,它将读取游戏参与者的数量,通过随机错乱将每个参与者分配给另一个参与者,确保没有参与者分配给自己,并向每个参与者发送电子邮件 它似乎执行正确并给出预期的输出,但在中止之前,在执行结束时返回C 随机错乱内存泄漏,c,algorithm,sorting,random,C,Algorithm,Sorting,Random,我写了一个秘密的圣诞老人程序,它将读取游戏参与者的数量,通过随机错乱将每个参与者分配给另一个参与者,确保没有参与者分配给自己,并向每个参与者发送电子邮件 它似乎执行正确并给出预期的输出,但在中止之前,在执行结束时返回free():无效指针。我是否在derange()函数中写了一些我似乎找不到的东西?另外,我的随机精神错乱逻辑看起来合理吗?它似乎测试得很好,但我怀疑它没有给出真正的随机分布 意识到有些功能可以让我的生活更轻松,比如memcpy(),甚至shuffle(),但这对我来说主要是一个学习
free():无效指针。我是否在derange()
函数中写了一些我似乎找不到的东西?另外,我的随机精神错乱逻辑看起来合理吗?它似乎测试得很好,但我怀疑它没有给出真正的随机分布
意识到有些功能可以让我的生活更轻松,比如memcpy()
,甚至shuffle()
,但这对我来说主要是一个学习练习——尽管我确实希望在假期中使用它。好心点,我才刚开始呢
编辑:清理代码以获得更简单的示例
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];
}
}
}
}
struct-person{
字符名[30];
char电子邮件地址[30];
char secretSanta[30];
};
内部主(空){
int n;
scanf(“%d”和“&n”);
结构人*成员=(结构人*)malloc(n*sizeof(结构人));
精神错乱(成员,n);
免费(会员);
返回0;
}
无效混乱(结构人*p,整数n){
srand(时间(空));
整数猜测[n];
int i,j,r;
对于(i=0;i
在将i
设置为-1后,您可能会访问猜测[i]
和p[i]
:
添加一行:
} else {
for(j = 0; j < n; j++) {
if(r == guesses[j]) {
i = -1;
guesses[j] = -1;
// number already used, restart main loop
}
}
if (i == -1) continue; //Prevent accessing guesses[-1]
guesses[i] = r;
for(j = 0; j < 30; j++) {
p[i].secretSanta[j] = p[r].name[j];
}
}
}其他{
对于(j=0;j
请回答您的问题,告诉我们您进行了什么样的调试。我希望您已经在Valgrind或类似的检查器中运行了自己的代码,并且已经使用诸如GDB之类的调试器进行了调查。确保还启用了一整套编译器警告。这些工具告诉了你什么,它们遗漏了什么信息?阅读Eric Lippert的。请使用你的代码将其简化为你问题的一部分。您当前的代码包含了许多与您的问题无关的内容—一个最小的样本通常看起来类似于一个好的单元测试:只执行一个任务,输入值指定为可再现性。此外,不要强制转换malloc()
(即只需编写struct person*members=malloc(sizeof*members*n);
)并且不要溢出存储空间(即scanf(“%29s”,p->name);
等)。这可能是因为else
的第二个循环使用i
作为索引,即使在您之前将其设置为-1之后也是如此;但是,您还需要初始化猜测[]
的元素。按照托比的建议运行valgrind
,揭示了这两个问题。啊,错过了!谢谢你,先生。