可以硬编码地址并手动将其分配给指针吗?
Can hard-code address and manually assign it to a pointer?
当我编译这段代码时:
int main() {
int a = 10;
int *p = &a;
printf("%p",p) // or printf("%p",&a);
return 0;
}
它打印 0022ff38
。
然后这段代码:
int a=10;
int *p =(int *)0x22ff38;
printf("%d",*p); //does not output 10;
应该打印 10,但它输出了另一个东西(2293560)
。
但是当我编辑代码时,添加一行:
int main() {
int a = 10;
int *p =(int *)0x22ff38;
printf("%p",&a);
printf("%d",*p); // Now it prints correctly:10
return 0;
}
一切正常!
Questions:
- 为什么我的代码在第一个代码中没有输出
a
值?
- 这种寻址指针的用法是什么?有用吗?
编辑:
我在 Linux 中没有问题,因为在 Linux 中,每次我 运行 代码时,变量地址都会改变并且程序输出 segmentation fault
。但在 windows 中地址保持不变,预计 手动寻址 在 windows.
中工作
编译器比你想象的要聪明。例如,给定此代码:
int main() {
int a=10;
int *p =(int *)0x22ff38;
printf("%d",*p);
}
编译器会发现 a
从未被使用过。所以它永远不会为它实际分配任何内存。
如果添加 printf("%d", a)
,编译器可能只会将 a
放入寄存器中,而不会放入内存中。
从根本上说,您不能假设两个程序会将变量放在内存中的同一位置。
当我编译这段代码时:
int main() {
int a = 10;
int *p = &a;
printf("%p",p) // or printf("%p",&a);
return 0;
}
它打印 0022ff38
。
然后这段代码:
int a=10;
int *p =(int *)0x22ff38;
printf("%d",*p); //does not output 10;
应该打印 10,但它输出了另一个东西(2293560)
。
但是当我编辑代码时,添加一行:
int main() {
int a = 10;
int *p =(int *)0x22ff38;
printf("%p",&a);
printf("%d",*p); // Now it prints correctly:10
return 0;
}
一切正常!
Questions:
- 为什么我的代码在第一个代码中没有输出
a
值? - 这种寻址指针的用法是什么?有用吗?
编辑:
我在 Linux 中没有问题,因为在 Linux 中,每次我 运行 代码时,变量地址都会改变并且程序输出 segmentation fault
。但在 windows 中地址保持不变,预计 手动寻址 在 windows.
编译器比你想象的要聪明。例如,给定此代码:
int main() {
int a=10;
int *p =(int *)0x22ff38;
printf("%d",*p);
}
编译器会发现 a
从未被使用过。所以它永远不会为它实际分配任何内存。
如果添加 printf("%d", a)
,编译器可能只会将 a
放入寄存器中,而不会放入内存中。
从根本上说,您不能假设两个程序会将变量放在内存中的同一位置。