Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 随机错乱内存泄漏_C_Algorithm_Sorting_Random - Fatal编程技术网

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
,揭示了这两个问题。啊,错过了!谢谢你,先生。