可以在地址被分配在C变量?(Can an address be assigned to a vari

2019-07-04 03:29发布

是否有可能分配一个变量,你想要的地址,在内存?

我想这样做,但作为“左值要求为左赋值操作数”我正在一个错误。

int main() {
  int i = 10;
  &i = 7200;
  printf("i=%d address=%u", i, &i);
}

什么是错我的做法? 是否有任何C的方式,使我们可以将我们想要的地址,给一个变量?

Answer 1:

不能直接使用。 你可以这样做,但:INT * I = 7200; ..然后我使用(即* I = 10),但你很可能得到一个崩溃。 设备驱动程序,等等......与已知的内存addreses - 做低层次发展时,这是唯一有意义的。



Answer 2:

假设你是一个现代操作系统上的86型processer,这是不可能写aribtray存储位置; 在音乐会的CPU作品与OS,以保护存储器中,使得一个进程不能意外(或有意地)覆盖另一个进程的存储器。 允许这将是一个安全风险(详见:缓冲区溢出)。 如果您尝试无论如何,你得到的“分段故障”错误的OS / CPU阻止你这样做。

有关该技术的详细信息,你要开始与1 , 2和3 。

相反,你问OS给你,你可以写,使用一个内存位置malloc 。 在这种情况下,操作系统内核(一般允许写入到任意的内存地址的唯一进程)发现的内存空闲区域并将其分配给您的过程。 分配过程也标志着该区域的内存属于你的过程中,让你可以阅读和写。

然而,不同的OS /处理器架构/配置可以把你写的任意位置。 在这种情况下,该代码将工作:

#include <stdio.h>
void main() {
  int *ptr;
  ptr = (int*)7000;
  *ptr = 10;
  printf("Value: %i", *ptr);
}


Answer 3:

C语言提供了决不是“连接”的名称到一个特定的内存地址。 即你不能告诉一个特定的变量名应该是指位于特定地址的左值的语言。 所以,回答你的问题,如上所述,是“没有”。 故事结局。

此外,从形式上来讲,有具体数字地址工作在C本身没有定义的功能,将帮助你做到这一点的语言中没有替代移植的方法。

然而,具体实施可能会为您提供的手段来访问特定的地址。 在典型的实现方式中,积分值转换A到指针类型创建一个指向地址的指针A 。 通过取消引用指针这样就可以访问该存储位置。



Answer 4:

不可移植性。 但是一些编译器(通常为嵌入式世界)有扩展做到这一点。

例如在IAR编译器(这里MSP430),你可以这样做:

static const char version[] @ 0x1000 = "v1.0";

这将使对象version ,在内存地址0x1000



Answer 5:

没有。

即使你能,7200是不是指针(内存地址),它是一个int,这样,才不会反正工作。



Answer 6:

有可能是没有办法确定一个变量都会有哪些地址。 至于你最后的希望,有一种叫做“指针”,所以你可以在地址修改值7200 (虽然这个地址可能会被访问):

int *i = (int *)7200;
*i = 10;


Answer 7:

使用ldscript / cmd文件。 然而,这会,指定在链接时,不运行时间。

连接器命令文件语法在很大程度上取决于具体的编译器。 所以,你需要谷歌的链接命令文件,你的编译器。

近似伪语法将有点像这样:

In linker command file:
.section start=0x1000 lenth=0x100 myVariables
In C file:
#pragma section myVariables
int myVar=10;


Answer 8:

这是不可能的,也许可能有编译器扩展。 但是,您可以在您想要的(如果地址是访问你的进程)地址访问内存:

int addr = 7200;
*((int*)addr) = newVal;


Answer 9:

我认为,“&”与一个在编译时我认为这是一个虚拟地址。所以它不是一个左值根据你的编译器评估我的地址。 使用指针代替



文章来源: Can an address be assigned to a variable in C?