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

时间:2012-11-26 05:14:05

标签: c pointers memory-address addressof address-operator

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

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

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

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

9 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

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

此外,从形式上讲,没有其他可移植的方式来处理C中的特定数字地址。语言本身没有定义任何可以帮助你做到这一点的功能。

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

答案 2 :(得分:3)

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

有关此问题的技术详情,您需要从123开始。

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

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

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

答案 3 :(得分:1)

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

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

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

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

答案 4 :(得分:0)

没有

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

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

近似伪语法有点像这样:

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

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

我认为 &amp; a 中的 '&amp;' 会在编译时评估i的地址我认为这是一个虚拟地址。因此,根据您的编译器,它不是Lvalue。请改用指针