这是该计划:
#include<stdio.h>
void main() {
int *x,*y;
int a=23,b=56;
x=&a;
y=&b;
printf("%d\t%d",x,y);
x++;
y++;
/* here only x is incremented but y remains same. What is the reason? */
printf("\n%d\t%d",x,y);
}
Run Code Online (Sandbox Code Playgroud)
即x增加2.但是y保持不变.怎么样?
pax*_*blo 11
有没有保证您的指针是大小为您的整数相同的,所以你真的不应该使用%d的格式说明.
当人们使用一个说明符传递long变量时,我已经看到了与此类似的问题.因为长度比它宽,所以它混淆了堆栈上的东西.printfintintprintf
你应该%p用于指针.标准方面,该代码还存在许多其他问题.尝试以下作为起点:
#include <stdio.h>
int main (void) {
int *x, *y;
int a = 23, b = 56;
x=&a; y=&b;
printf ("%p %p\n", x, y);
x++; y++;
printf ("%p %p\n", x, y);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是一个可能的解释(感谢Michael Burr的评论):
假设您的指针是32位,整数是16位,并且您使用的是小端架构(如Intel).
此外,假设地址为ais 0x12345678和地址b为0x1234567a.
当你传递它们时printf,你在堆栈上推送两个32位值,但printf只读取两个16位值,因为它已被告知%d %d格式说明符:
himem
--------
/ | 0x12 |
push | 0x34 |
| | 0x56 |
\ | 0x78 |
--------
/ | 0x12 | \ printf reads 0x1234
push | 0x34 | /
| | 0x56 | \ printf reads 0x567a
\ | 0x7a | /
--------
lomem
Run Code Online (Sandbox Code Playgroud)
然后,当你增加两个指针并printf再次调用时,你得到:
himem
--------
/ | 0x12 |
push | 0x34 |
| | 0x56 |
\ | 0x7a |
--------
/ | 0x12 | \ printf reads 0x1234
push | 0x34 | /
| | 0x56 | \ printf reads 0x567c
\ | 0x7c | /
--------
lomem
Run Code Online (Sandbox Code Playgroud)
所以你可以在那个场景中看到为什么它看起来好像只有一个指针已经递增但真正的问题是你没有打印指针,而是你打印其中一个最重要的一半(这可能赢了)不改变)和同一个的最不重要的一半(将改变).
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |