2013-03-26 134 views
0

我写一个程序,在学校一个班级,我不能让程序打印出什么我键入英寸输入和输出数组不匹配

的问题指出,第一行需要包含“考试”后面有一个空格,然后是答案键。我想打印答案键以确保它正确输入,并且它与我输入的内容不匹配。代码如下所示。

这是开始运行的主文件,它从另一个文件中调用了一个方法,我已经正确创建了原型文件,所以我非常肯定它不是这样。

int main() 
{ 
    int i; 
    int noOfQuestions; 
    scanf("%d ", &noOfQuestions); 
    char * answerKeyPtr; 

    answerKeyPtr = fgetAnswers(noOfQuestions); 

    for(i = 0; i < noOfQuestions; i++){ 
     printf("%c",answerKeyPtr[i]); 
    } 
    printf("\n"); 

    return 0; 
} 

char *fgetAnswers(int noOfQuestions){ 
    int i; 
    char * answerKeyPtr; 
    char AnswerKey[noOfQuestions]; 
    answerKeyPtr = AnswerKey; 

    for(i = 0; i < noOfQuestions; i++){ 
     scanf("%c",&AnswerKey[i]); 
    } 

    return answerKeyPtr; 
} 

回答

0

你在这里有什么是内存问题。

您正在将数据存储到AnswerKey阵列中,该阵列位于fgetAnswers()的本地。问题是你要返回一个指向该局部变量的指针,并且只要你的fgetAnswers()函数完成了内存不应该被访问的地方,该变量的内存就不可靠。所以当你试图在main()中打印数据时,你正在访问你不应该使用的内存。

要解决该问题,请在main中创建AnswersKey数组,并将其作为参数传递给fgetAnswers()函数。

+0

完美!非常感谢! – henryjarend 2013-03-26 03:51:26

0

的字符数组被AnswerKeyfgetAnswers称为堆栈上分配。当您从fgetAnswers返回时,存储在该呼叫的堆栈帧中的数据不再有效。您需要传入数组或将其分配,以便输入不会存储在堆栈中。

+0

所以我在后面添加了'char answerKey [noOfQuestions];'到主函数的开始和'answerKeyPtr =&answerKey [0];'几行。那是你在说什么?我仍然有点困惑与指针 – henryjarend 2013-03-26 03:33:46

+0

你仍然有一个问题。在你有noOfQuestions的值之前,你不能使用char answerKey [noOfQuestions]来分配数组。在阅读题目数量后,你应该分配空间。你也可以定义一个MAXQUESTIONS常量并声明该数组的大小,然后确保读入的数字是<= MAXQUESTIONS。我建议使用alloc,因为你需要适应指针。 – Fred 2013-03-26 03:41:12

+0

在您分配数组来保存答案后,将其传递给您的fgetAnswers函数。 fgetAnswers(int noOfQuestions,char * questionBuffer)或者,使用alloc()为函数内的字符数组分配空间。这将是安全的回报。稍后,您应该学习如何使用free()在完成时释放alloc() - ed空间。 – Fred 2013-03-26 03:48:46