考虑以下情况:
美国国家半导体的SC/MP有一些指针,当你继续递增它们时,它将从0x0FFF滚动到0x0000,因为增量电路不会传播进位超过较高字节的较低的nybble.因此,例如,如果我想要while(*ptr++)遍历以null结尾的字符串,那么我可能最终ptr指向数组外部.
在PDP-10上,由于机器字长于地址1,指针可能在包含地址的字的上半部分中具有标签和其他数据.在这种情况下,如果递增指针导致溢出,则其他数据可能会被更改.对于非常早期的Macintoshes,在ROM为32位清洁之前也是如此.
所以我的问题是关于C标准是否说明指针递增的含义.据我所知,C标准假定它应该以与递增整数相同的方式逐位工作.但是,正如我们所看到的那样,这并不总是成立.
符合标准的C编译器是否可以发出一个简单的adda a0, 12来递增指针,而不检查进位传播的存在或不存在会导致奇怪?
1:在PDP-10上,地址是18位宽,但机器字是36位宽.机器字可以包含两个指针(对于Lisp很方便)或一个指针,加上位域,这意味着"添加另一个间接级别",段,偏移等.或者机器字当然可以不包含指针,但这不是与这个问题有关.
2:将一个添加到地址.这是68000汇编程序.
我正在使用dlsym在我的程序中查找符号,但它总是返回NULL,这是我没想到的.根据联机帮助页,如果某种方式存在错误,或者符号确实为NULL,则dlsym可能返回NULL.在我的情况下,我收到一个错误.我会告诉你我今晚做的MCVE.
这是instr.c的内容:
#include <stdio.h>
void * testing(int i) {
printf("You called testing(%d)\n", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
一个非常简单的东西,只包含一个不起眼的示例函数.
这是test.c的内容:
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
typedef void * (*dltest)(int);
int main(int argc, char ** argv) {
/* Declare and set a pointer to a function in the executable */
void * handle = dlopen(NULL, RTLD_NOW | RTLD_GLOBAL);
dlerror();
dltest fn = dlsym(handle, "testing");
if(fn == NULL) {
printf("%s\n", dlerror());
dlclose(handle);
return 1;
}
dlclose(handle);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我使用调试器逐步执行代码时,我看到dlopen正在返回一个句柄.根据联机帮助页,If filename is …
所以我目前正在学习Rust,并且有一个关于如何实现非消耗迭代器的问题。我编写了一个堆栈:
struct Node<T>{
data:T,
next:Option<Box<Node<T>>>
}
pub struct Stack<T>{
first:Option<Box<Node<T>>>
}
impl<T> Stack<T>{
pub fn new() -> Self{
Self{first:None}
}
pub fn push(&mut self, element:T){
let old = self.first.take();
self.first = Some(Box::new(Node{data:element, next:old}));
}
pub fn pop(&mut self) -> Option<T>{
match self.first.take(){
None => None,
Some(node) =>{
self.first = node.next;
Some(node.data)
}
}
}
pub fn iter(self) -> StackIterator<T>{
StackIterator{
curr : self.first
}
}
}
pub struct StackIterator<T>{
curr : Option<Box<Node<T>>>
}
impl<T> Iterator for StackIterator<T>{
type Item = …Run Code Online (Sandbox Code Playgroud)