是否可以在内存中为变量分配所需的地址?
我试图这样做,但我收到一个错误,因为“Lvalue需要作为左操作数的分配”。
int main() {
int i = 10;
&i = 7200;
printf("i=%d address=%u", i, &i);
}
我的做法有什么问题? 在C中有什么方法可以将我们想要的地址分配给变量吗?
答案 0 :(得分:4)
不直接。 你可以这样做:int * i = 7200; ..然后使用i(即。* i = 10),但你很可能会崩溃。这只有在进行低级开发时才有意义 - 设备驱动程序等......具有已知的内存地址。
答案 1 :(得分:3)
C语言使您无法将名称“附加”到特定的内存地址。即你不能告诉语言特定的变量名称应该引用位于特定地址的左值。所以,如上所述,你的问题的答案是“不”。故事结束。
此外,从形式上讲,没有其他可移植的方式来处理C中的特定数字地址。语言本身没有定义任何可以帮助你做到这一点的功能。
但是,特定实现可能会为您提供访问特定地址的方法。在典型的实现中,将整数值A
转换为指针类型会创建指向地址A
的指针。通过取消引用这样的指针,您可以访问该内存位置。
答案 2 :(得分:3)
假设您使用的是现代操作系统上的x86型处理器,则无法写入aribtray内存位置; CPU与操作系统协同工作以保护内存,以便一个进程不会意外(或有意)覆盖另一个进程的内存。允许这样做会带来安全风险(请参阅:缓冲区溢出)。无论如何,如果您尝试,则会出现“分段错误”错误,因为操作系统/ CPU会阻止您执行此操作。
相反,您要求操作系统使用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。请改用指针