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页面粒度)。