可以将地址分配给C中的变量吗?

是否可以在内存中为变量分配所需的地址?

我试图这样做,但我得到一个错误,因为“Lvalue需要作为左操作数的赋值”。

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

我的方法出了什么问题? 在C中有什么方法可以将我们想要的地址分配给变量吗?

不是直接的。 你可以这样做:int * i = 7200; ..然后使用i(即。* i = 10),但你很可能会崩溃。 这仅在进行低级开发时才有意义 – 设备驱动程序等…具有已知的内存地址。

假设您使用的是现代操作系统上的x86型处理器,则无法写入aribtray内存位置; CPU与操作系统协同工作以保护内存,以便一个进程不会意外(或有意)覆盖另一个进程的内存。 允许这样做会带来安全风险(请参阅:缓冲区溢出)。 无论如何,如果您尝试,则会出现“分段错误”错误,因为操作系统/ CPU会阻止您执行此操作。

有关此问题的技术细节,您需要从1,2和3开始 。

相反,您要求操作系统使用malloc为您提供可写入的内存位置。 在这种情况下,OS内核(通常允许写入任意内存位置的唯一进程)找到一个空闲的内存区域并将其分配给您的进程。 分配过程还会将内存区域标记为属于您的进程,以便您可以读取并编写它。

但是,不同的OS /处理器体系结构/配置可以允许您写入任意位置。 在这种情况下,此代码将起作用:

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

C语言使您无法将名称“附加”到特定的内存地址。 即你不能告诉语言特定的变量名称应该引用位于特定地址的左值。 所以,如上所述,你的问题的答案是“不”。 故事结局。

而且,从forms上讲,没有替代的可移植方式来处理C中的特定数字地址。语言本身没有定义任何可以帮助您做到这一点的function。

但是,特定实现可能为您提供访问特定地址的方法。 在典型的实现中,将整数值A转换为指针类型会创建指向地址A的指针。 通过取消引用此类指针,您可以访问该内存位置。

不便携。 但是一些编译器(通常用于嵌入式世界)有扩展function。

例如,在IAR编译器(此处为MSP430)上,您可以这样做:

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

这将把对象version放在内存地址0x1000

没有。

即使你可以,7200不是一个指针(内存地址),它是一个int,所以无论如何都无法工作。

可能无法确定变量将具有哪个地址。 但作为对你的最后一个希望,有一个叫做“指针”的东西,所以你可以修改地址7200上的值(虽然这个地址可能无法访问):

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

使用ldscript / linker命令文件。 但是,这将在链接时分配,而不是在运行时分配。

链接器命令文件语法很大程度上取决于特定编译器 因此,您需要为编译器google for linker命令文件。

近似伪语法有点像这样:

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

这是不可能的,也许可以使用编译器扩展。 但是,您可以访问所需地址的内存(如果您的进程可以访问该地址):

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

我认为‘&’ in &a在编译时评估i的地址,我认为它是一个虚拟地址。因此根据你的编译器,它不是Lvalue。 改用指针

Interesting Posts