C语言中如何通过一个具体的内存地址的常量?如何理解结构中包含一个指向结构本身的指针
具体举例:
目标内存单元地址:⓪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;}至于该指针如何指向,就只能看题主想要的是什么了,只要能清晰地画出来上面那个图的样子,就能理解这①点了。
- 5星
- 4星
- 3星
- 2星
- 1星
- 暂无评论信息
