二级指针失效的一种原因(scanf函数)
最近使用 C 语言写一个学生管理系统,突发奇想,想使用二级指针接收判断后的结果,函数实现已经写好了,可经过几轮测试发现二级指针变量总是变成 0 ,以下是代码片段:
以下是用于接收判断的数据是否合理的一些变量,其中第三行是二级指针。
scanf 函数,读取数据至临时学生结构体,有些数据需要单独处理,但细心的大佬就会发现,年龄使用了 %d &tempage 对,乍一看是将读取的整形,隐式转换为 char 型,节约储存空间,但其中暗藏杀机。
接下来就是函数 void judgeDataForCorrect(STUDENT student,char ** result); 用于判断输入的数据是否合理,例:当分数在 0 至 150之外时,赋值为 'n' ,否则为 'y',其他判断亦是如此,STUDENT student 是被验证的数据,char ** result 用于接收被验证的数据是否合理的结果,形如 'yynyynn'。
当运行程序后,程序崩溃了,没有一点提示。经过排查,发现二级指针的地址位于 char tempage=0; 之上,且他们之间的地址,只相隔了一个字节。

是不是 char tempage 数据影响了二级指针的数据呢?
将原有的 scanf 函数
改为:
输入 "韩梅梅 34" 回车,进行测试发现读取的 tempage 为 3 ,二级指针存储的数据也正确,然后再将 %c 改为 %d 进行测试发现,此时 tempage 居然是 " ,但二级指针储存的数据变为了 0 。
由此可以推测,scanf("%d",&charAge); 并不会如我们所想的将读取到的数字隐式的转换为 char(数字[34]->字符34["]) ,而是将读取到的数字以二进制形式存储到了 char 类型变量中,占据了自 char 类型变量起,往后4个字节,因为 char 类型数据只有 1 字节存储空间,所以势必会影响到后面的二级指针。

再次测试,将 %d 改回 %c 然后再进行读取,发现二级指针储存的数据回复正常了 !
得出结论,scanf 函数将读取到的数据,按格式化字符串接受的类型,原封不动的以二进制形式存储到后面对应地址中,此间不会发生任何隐式转换!
所以使用 scanf 函数,一定要将格式化字符串与后面接受的地址一一对应。
画渣up,请不要介意


