如何用C编程语言手动分配指针地址?

Ira*_*kli 48 c memory pointers

如何0x28ff44用C编程语言手动分配指针地址(例如到存储器地址)?

T.J*_*der 72

像这样:

void * p = (void *)0x28ff44;
Run Code Online (Sandbox Code Playgroud)

或者如果你想要它char *:

char * p = (char *)0x28ff44;
Run Code Online (Sandbox Code Playgroud)

...等等.

如果你指的是你真的,真的不想改变,添加一个const:

const void * p = (const void *)0x28ff44;
const char * p = (const char *)0x28ff44;
Run Code Online (Sandbox Code Playgroud)

...因为我认为这必须是某种"众所周知的地址",并且这些地址通常(尽管绝不总是)只读.

  • @Zaibis:我不认为C语言会以这种或那种方式说出来.您正在使用该语言的系统才是最重要的.Delnan在关于这个问题的评论中说得很好:*"不用说,这可能是毫无意义的 - 如果不是简单的自杀行为 - 除了某些嵌入式系统之外."*有很少的用例对于硬编码指针值,但也有一些.回到白天,我似乎记得直接访问DOS中的显示内存... ;-)因此上面的"众所周知的地址"评论. (3认同)
  • 如果我错了,请纠正我。但是,在C未定义行为中为指针分配无效地址不是吗?与不允许使用指针算术产生的结果相同,该结果既不指向有效对象,也不位于数组内或后面没有1个元素? (2认同)
  • @TJCrowder - 实际上,硬编码指针有很多*用途.这种情况一直发生在微控制器以及"正常"系统的引导加载程序和驱动程序中.通常,指针本身可以是"const",但它指向的数据不是.大多数程序员从来没有看到过该代码或者知道它是如何工作的.虽然我可能会添加 - 这越来越多地成为C仍然最相关的地方,因为越来越少的应用程序软件有任何真正的理由用C语言编写. (2认同)

zsa*_*ank 9

你的代码是这样的:

int *p = (int *)0x28ff44;
Run Code Online (Sandbox Code Playgroud)

int需要是您引用的对象的类型,或者可以是void.

但要小心,以免您尝试访问不属于您的程序的内容.


小智 5

int *p=(int *)0x1234 = 10; //0x1234 is the memory address and value 10 is assigned in that address


unsigned int *ptr=(unsigned int *)0x903jf = 20;//0x903j is memory address and value 20 is assigned 
Run Code Online (Sandbox Code Playgroud)

基本上在嵌入式平台中,我们直接使用地址而不是名称