C语言中如何通过一个具体的内存地址的常量?如何理解结构中包含一个指向结构本身的指针

时间:2018-01-10 13:48:02   浏览:次   点击:次   作者:   来源:   立即下载

具体举例:

目标内存单元地址:⓪xCCCCCCCC

数值:①⓪⓪

希望将数值存储为类型:int

除此外不使用其他变量.

最终编译效果:mov CCCCCCCCH, ⑥④H

如何达成?

我也对原始需求感兴趣。

至于题主想要的C代码:

*((int*)⓪xCCCCCCCC) = ①⓪⓪;或者像评论里提醒到的,如果要强制保证这个操作不被优化掉的话,加volatile:

*((volatile int*)⓪xCCCCCCCC) = ①⓪⓪;

GCC在x⑥④上生成的代码会是:(AT&T语法)

movl$③④③⑤⑨⑦③⑧③⑥ · %eaxmovl$①⓪⓪ · (%rax)对应回Intel语法的话:

mov eax, ⓪xCCCCCCCCmov dword ptr [rax], ⓪x⑥④但是题主想要的是单条指令形式的:

c⑦ ⓪⑤ cc cc cc cc ⑥④ ⓪⓪ ⓪⓪ ⓪⓪ mov dword ptr ds:[⓪xCCCCCCCC],⓪x⑥④没找到啥编译选项能逼GCC生成这种单条指令形式的mov。

至于说x⑧⑥不支持赋值目标和源都是立即数的同学们,你们真的用过opcode为C⑦的mov指令么?

C⑦ /⓪MOV r/m③② · imm③②好吧是因为NASM不支持所以就以为x⑧⑥不支持么。GNU as支持的喔。

这种其实是Recursive Data Type

题主所说的链表,大致可以看成这种结构:

其实去掉最开始的那个是结点(④②),余下的两个结点还是能够构成①个链表。

也即①个类型实例中可能会包含另①个同样类型的实例。

这就是为什么会被称为递归数据类型的原因。

上面的结构对应到Haskell中如下:

data List e = Nil | Cons (e, List e) -- List typeCons(④② · Cons(⑥⑨ · Cons(⑥①③ · Nil))) -- the list或者对应到Java也很明显:

class List { E value; List next;}但是在C语言里面,因为默认是值语义,所以不可能出现像Java这种写法(首先定义在类型的时候就会出错,其次,就算不出错也会出现某答案中sizeof无穷的问题)。

于是只好用指针来代替了。

typedef int ElementType;struct List { ElementType value; struct List* next;}至于该指针如何指向,就只能看题主想要的是什么了,只要能清晰地画出来上面那个图的样子,就能理解这①点了。

收起

相关推荐

相关应用

平均评分 0人
  • 5星
  • 4星
  • 3星
  • 2星
  • 1星
用户评分:
发表评论

评论

  • 暂无评论信息