以下功能aquire_marks
旨在获取5个用户输入的数字,并将其存储在marks
中。运行时,for循环按预期运行j=0
一次,然后按预期运行j=1
,但j
永远不会增加到2
,并保持在{{ 1}},让函数处于无限循环中。如果循环放在1
内,则不会发生此问题,但如果可能的话,我更愿意将其放在单独的函数中。有什么想法在这里发生了什么?
main
答案 0 :(得分:7)
您已将mark
声明为char
,但在scanf
调用中您正在使用d
转换说明符,该说明符要求其对应的参数具有类型int *
,而不是char *
。使用错误的转换说明符会导致未定义的行为。
我将推测mark
和j
在内存中相邻,并且在读取mark
的整数值的过程中(可能在2到4之间)字节宽)j
的值被覆盖。
mark
是否应该代表数值(90
,75
等)?如果是,请将mark
的类型从char
更改为int
。
如果mark
应该代表字母等级(A
,B
等),请将scanf
调用更改为
scanf( " %c", &mark ); // note leading whitespace
答案 1 :(得分:3)
您正在将1 byte
变量(char
)的地址传递给将威胁它作为int
指针的函数。
如果我们假设int
为4 bytes
,则scanf
会覆盖3 byte
变量附近的堆栈mark
。
第一个可能是j
;