C 取消引用字符*总是会导致分段错误

C 取消引用字符*总是会导致分段错误,c,pointers,operating-system,C,Pointers,Operating System,我试图查看内存地址,并查看相邻内存区域的不同可访问性,它们是:只读、读写和无可访问性。我还有一个处理分段错误的信号处理器,这样程序就可以继续运行了 char* currentAdd; char readBuf; for (unsigned int i = 0; i < 0xffffffff, i+=PAGE_SIZE){ currentAdd = (char*)i; jmpVar = sigsetjmp(env,1); // don't worry about this

我试图查看内存地址,并查看相邻内存区域的不同可访问性,它们是:只读、读写和无可访问性。我还有一个处理分段错误的信号处理器,这样程序就可以继续运行了


char* currentAdd;
char readBuf;

for (unsigned int i = 0; i < 0xffffffff, i+=PAGE_SIZE){
    currentAdd = (char*)i;
    jmpVar = sigsetjmp(env,1); // don't worry about this, it's handled properly

    if(jmpVar == 0){
    currentMode = MEM_RO;
    readBuf = *currentAdd; // always a segmentation fault
    
    // it can never try writing!!
    currentMode = MEM_RW;
    *currentAdd = readBuf;
    }
    else{
    ...
    }

}


字符*当前添加;
char readBuf;
for(无符号整数i=0;i<0xffffffff,i+=页面大小){
currentAdd=(char*)i;
jmpVar=sigsetjmp(env,1);//不用担心,它处理得很好
如果(jmpVar==0){
currentMode=MEM_RO;
readBuf=*currentAdd;//始终是分段错误
//它永远无法尝试写作!!
currentMode=MEM_RW;
*currentAdd=readBuf;
}
否则{
...
}
}
我的程序从未经过(readBuf=*currentAdd;),这有时是预期的,但并非总是如此。我做错什么了吗


我试着从I=1开始,以避免一些人的建议,但它仍然会给我分段错误。

好吧,你从I=0开始循环,然后在地址I处给currentAdd一个字符的地址,所以currentAdd基本上是(void*)0,也就是NULL,所以你推迟了NULL,没有一台计算机真的像这样。

你真的对取消引用空分段错误感到惊讶吗?对于i=0不,这是预期的,但不是其余的。为什么不呢?位置1位于隔壁,因此位于同一页面中,具有相同的权限/保护:(您使用的是什么操作系统?如果是Linux,请查看
/proc/$PID/maps
以查看实际映射的内容。没有必要尝试根据经验确定这一点,操作系统只会告诉您。但这仅适用于i=0,当我增加它时,它不应该总是给出分段错误。我做了,但同样,问题在于其他方面。如果您试图访问程序请求之外的内存,例如如果您声明一个10 int的数组,如果您试图访问第11个数组,则总是会出现segfault。不一定,但几乎总是如此。@Bamontan不是这样。事实上,很多时候您的程序都不会出现segfault,因为内存映射到he进程(4k页面粒度)。