linux C下是不是不能直接给一个地址指针赋值?

来源:百度知道 编辑:UC知道 时间:2024/05/08 06:16:33
比如(*(volatile unsign *)0x1000c0e)=1?

我不知道怎么理解你的话。我可以理解几种:

1.我有个一个指针,我把值赋值到这个指针指向的内存中去,这个毋庸置疑是可以的。例如:int * a = (int *) malloc (sizeof(int)); (*a) = 1;没有任何问题。

2.我有一个指针,我要改变这个指针的地址。例如:int * a, b, c; a = &b; a = &c;这个也是可以的。

3.我估计你要问的是这个,int * a; a = 2000;这里的2000是地址,这么做没有任何问题,因为你可以看的出来他和2的情况是一模一样的,只不过2里面是取c的地址给了a,这里是你自己制定确切的地址给a.但有一点要注意,2000是你给的,不是操作系统给的,没人能够保证2000能够进行地址映射到达一个可用的内存。所以在接下来的操作中,没人能保证对a所指向的内存进行操作能够成功。原因因为,地址印射中会对你的2000印射执行权力检测,这是由操作系统和硬件CPU还有8259A芯片共同完成的,你能不能够通过这个检测到达内存是个问题。

最后给你补充个代码:
int * a;
int b = 1;
printf("%ld\n", &b);
执行完毕后,你就能看到b的逻辑地址,它被打印出来了。你直接把这个数字给a,你就会发现它们的效果等同于 a = &b;
原因:1.编译后,逻辑地址不会被改变,(逻辑地址不是最后的物理地址,但是在进程中它能够决定最终物理地址,所以不会有问题)。2.b的地址肯定是可用的。

至于2楼所谓的核心态问题,这个是可以的,核心态可以到达任何一个地方的内存,因为它能够通过所有的权利检测,具体细节就比较多了,涉及到硬件和操作系统的内容。(没试过,虽然我写过核心态下的程序).

你那个很像 给一个寄存器赋值 0x1000c0e这个就是内存的逻辑地址

你可以让自己的程序运行在核心态,然后只要别往0x000000ff以内写数据都可以。

可以,但是不要这么写
volatile unsign *p ;
p = 0x1000c0e;
*p = 1;