c - 使用结构体调试 C 程序

标签 c file pointers structure

我正在尝试编写一个程序,对快速约会信息进行排序,以获得计算机科学 1 类(class)中的额外学分;我遇到了一个奇怪的问题。当程序进入一系列嵌套循环时,运行循环两次后会崩溃(在调用调试函数时)。函数传输数据;仅设计用于从文件中获取数据并将其移至结构中,以便稍后由尚未编写的函数进行处理。我一生都无法弄清楚,因此非常欢迎任何建议,下面我放置了代码,下面放置了我正在使用的测试数据。

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)。

最佳答案

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

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

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

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

关于c - 使用结构体调试 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10963690/

相关文章:

C++ 变量丢失

c - 如何正确获取一行并用 C 解析它

c - Linux:执行手动加载到内存的代码

c++ - strcmpi 整数,无转换错误

java - 文本文件号码持有者无法正常工作,如何修复?

java获取给定子文件夹的绝对路径

c++ - 在这种情况下,有人可以解释 "reference"和 "pointer"之间的区别吗?

c++ - 计算常量二维 c 数组中的行数

laravel - 从 storage/app/public/photos 中删除 Laravel 文件

签名中带有数组类型的 ccall 从 Julia 调用 C 中的结构