为什么我用了强制转换还会出现这些问题,而且为什么每次运行,a的地址都不一样的
#include<stdio.h>
#include<stdlib.h>
void main()
{
int *p=NULL;
int a = 10;
printf("%d\n", &a);
p =(int *) 0x0047abc;
*p = 20;
printf("%d", a);
}
不要随便看一些教程,有些只有高手才这么写。;p=(int *)0x0011这种直接赋值,最好不要这样写,程序在一次启动运行时,操作系统给这个程序划分了一块内存,每次都不一样
而且,我们程序员编写的程序,都是采用逻辑地址,0x0011这个地址只是在一个特定的一次运行有效
这不是很正常嘛,每次分配的内存地址都不一样
改成这样不就符合了么
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int *p = NULL;
int a = 10;
printf("%x\n", &a);
p = (int*)(&a);
*p = 20;
printf("%d", a);
return 0;
}
将地址常量赋值给p再通过p修改地址上的值容易导致一些问题,甚至可能很严重,因为谁也不知道这个地址上事先有没有存什么数据存了什么数据,如果修改了系统关键数据很可能导致系统崩溃。
另外变量的地址是由编译器自动分配的,所以每次a的地址不一样很正常的。
两次运行,a的地址可能会发生改变,所以你第一次看到的a的地址不一定第二次还适用,能理解运行过程就可以了,真正写程序的时候没人直接给地址的