0

我正在尝试编写一个程序,对我的计算机科学 1 课程中的速配信息进行分类以获得额外的学分;我遇到了一个奇怪的问题。程序在运行循环两次后遇到一系列嵌套循环时崩溃(在调用调试函数的地方)。函数传输数据;仅设计用于从文件中获取数据并将其移动到结构中,以便稍后由尚未编写的函数进行处理。我一生都想不通,所以非常欢迎任何建议,下面我已经放置了代码,下面是我正在使用的测试数据。

caData transferData(fData * fileData, caData * workingData, int numCouples)
{
    int i = 0, j = 0, k = 0;
    workingData->maData = (struct mData*)malloc(sizeof(mData)*(numCouples*2));//Create Array of Match Data with cells equal to double the number of couples
    workingData->maData->couData = (struct cData*)malloc(sizeof(cData)*numCouples);//Create a Couple structure array with a number of cells equal to the number of couples.
    ///TODO:
    //Read in Names
    for(i = 0; i < (numCouples * 2); i++)//Rotate through Matches
    {
        if(i < numCouples)//Men First
        {
            debug();
            for(j = 0; j < numCouples; j++)//Scan in First half of Couples
            {
                for(k = 0; k < numCouples; k++)//Scan In Male Names
                {
                    fscanf(fileData->inputData, "%s", workingData->maData[i].couData[j].guyName);
                }

                for(k = 0; k < numCouples; k++)//Scan In Female Names
                {
                    fscanf(fileData->inputData, "%s", workingData->maData[i].couData[j].girlName);
                }
            }
        }
        else//Now the women
        {
           for(j = 0; j < numCouples; j++)//Scan in First half of Couples
            {
                for(k = 0; k < numCouples; k++)//Scan In Female Names
                {
                    fscanf(fileData->inputData, "%s", workingData->maData[i].couData[j].girlName);
                }

                for(k = 0; k < numCouples; k++)//Scan In male Names
                {
                    fscanf(fileData->inputData, "%s", workingData->maData[i].couData[j].guyName);
                }
            }
        }
    }
    //Read In Scores
    //Compute differances

}

编辑:将代码压缩到错误的位置,即调用调试函数的位置;它运行两次,然后崩溃。它返回一个 -1073741819 (0xC0000005)。

4

1 回答 1

0

fscanf()接受一个FILE*参数,你已经给它传递了一个fData*. 除非这是一个别名,FILE*否则它不会做任何有意义的事情,如果它是一个类型别名 (typedef),为什么要以这种方式混淆它?

您正在分配传递给函数的某些结构的元素。如果不显示您传递的内容和结构的定义,则无法验证所示代码的正确性,但使用fscanf()分配字符串时最常见的错误是溢出缓冲区或未在第一名。在这种情况下,我将不得不询问guynameandgirlname成员是否是足够长度的数组。如果它们只是指针,那么您需要为数据分配空间。您还可以修改格式说明符以确保无法将太长的字符串复制到这些成员。

如果调用者传入,workingData则调用者应负责分配任何必要的数据。在本地分配动态内存并将其传递回调用者是不好的做法 - 它提出了内存将在何时何地被释放的问题,并要求内存韭菜。

最后,调试此代码的最简单、最快和最好的方法是在符号调试器中单步调试。

于 2012-06-09T20:15:12.430 回答