我正在尝试编写一个程序,在我的计算机科学1课程中对快速约会信息进行分类以获得额外的学分;我遇到了一个奇怪的问题。在运行循环两次后(在调用调试函数的位置),程序进入一系列嵌套循环时崩溃。函数transferData;仅用于从文件中获取数据并将其移动到结构中,以便稍后通过尚未编写的函数进行处理。我对我的生活无法理解,所以任何建议都会非常受欢迎,下面我把代码放在我正在使用的测试数据下面。
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)。
答案 0 :(得分:0)
fscanf()
获取FILE*
参数,您已将其传递给fData*
。除非这是FILE*
的别名,否则它不会做任何合理的事情,如果它是类型别名(typedef),为什么要以这种方式对其进行模糊处理?
您正在分配传递给teh函数的某些结构的元素。在没有显示您传递的内容和结构的定义的情况下,无法验证所显示代码的正确性,但使用fscanf()
分配字符串时最常见的错误是超出缓冲区或不具有首先分配一个缓冲区。在这种情况下,我不得不问guyname
和girlname
成员是否是足够长的数组。它们只是指针,然后你需要为数据分配空间。您也可以修改格式说明符,以确保字符串不能复制到这些成员的时间太长。
如果呼叫者正在传递workingData
,则呼叫者有责任分配任何必要的数据。在本地分配动态内存并将其传递给调用者是不好的做法 - 它会引发内存释放的位置和时间以及内存韭菜的问题。
最后,调试此代码的最简单,最快速和最好的方法是在符号调试器中逐步执行它。