小编Wil*_*son的帖子

C标准是否指定了递增指针时进位传播的距离?

考虑以下情况:

  • 美国国家半导体的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汇编程序.

c pointers language-lawyer

10
推荐指数
2
解决办法
382
查看次数

即使符号存在,dlsym也会返回NULL

我正在使用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 …

c linux dlsym

8
推荐指数
1
解决办法
2720
查看次数

Rust 实现迭代器

所以我目前正在学习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)

stack iterator rust

2
推荐指数
1
解决办法
921
查看次数

标签 统计

c ×2

dlsym ×1

iterator ×1

language-lawyer ×1

linux ×1

pointers ×1

rust ×1

stack ×1