编译、测试,打印结果如下:
打印结果符合预期!也就是说分成两条打印语句是可以正确读取到目标地址里的 int 型数据的,但是在一条语句里就不行!
其实此时,可以判断出大概是 printf 语句的原因了。从现象上看,似乎是 printf 语句在执行过程中打印第一个数字之后,影响到了指针 p 的值,但是具体是怎么影响的说不清楚,而且它是系统里的库函数,肯定不能改变 p 的值。
于是在 google 中搜索关键字:"glibc printf bug",你还别说,真的搜索到很多相关资料,但是浏览了一下,没有与我们的测试代码类似的情况,还得继续思考。
3. 一步步分析问题本质原因3.1 打印一个最简单的字符串
既然是因为在 printf 语句中打印 2 个数据才出现问题,那么我就把问题简化,用一个最简单的字符串来测试,代码如下:
char aa[] = "abcd";char *pc = aa;printf("%d, %d ", *pc, *pc);
编译、执行,打印结果为:"97, 97",非常正确!这就说明 printf 语句在执行时没有改变指针变量的指向地址。
3.2 打印一个结构体变量
既然在字符串上测试没有问题,那么问题就出在结构体类型上了。那就继续用结构体变量来测试,因为上面的测试代码是结构体变量的数组,现在我们把数组的影响去掉,只对单独的一个结构体变量进行测试:
Student s = {1, "a"};
printf("%d ", s);
printf("%d, %d ", s, s);
注意:这里的 s 是一个变量,不是数组了,所以打印时就不需要用 * 操作符了。编译、执行,输出结果: