在AIX上运行我的代码时,我遇到了一个未知且突然的分段错误。以下一行:
sourceSample +=value;
给出了分段错误。这里sourceSample是一个指向图像的指针。
我对上面的代码行做了一些更改,发生了以下情况:
int *p = sourceSample; sourceSample = p + value;
分段错误仍然存在。
int **p = &sourceSample; sourceSample = *p + value;
没有分段错误,代码也会成功执行。
任何人都可以告诉我为什么会这样吗?
ps:这是我对StackOverflow的第一个问题,如果我错过任何事情,那么请原谅我。
答案 0 :(得分:0)
我发现了问题的问题。 问题是因为在AIX中生成了错误的汇编代码。在添加'值'之后尝试访问sourceSample时发生分段错误。使用:
if(bitPos == bitPos_renew) {
sourceSample += value;
}
当'值'添加到sourceSample指针并尝试访问sourceSample,AIX引发了分段错误。这是因为变量'值中的值错误。
'值'的价值使用以下方式分配:
value = sx <= ex ? 1 : -1;
分配给它的值应为1或-1但是当我们在汇编代码中看到分配给64位寄存器的值时,参考变量&#39; value&#39;是
00000000FFFFFFFF
而不是
FFFFFFFFFFFFFFFF(-1)
因此,当&#39;值&#39;添加到sourceSample,它开始指向一些未分配的内存导致分段错误。
当我尝试打印变量&#39; value&#39;的值时,汇编代码会自动变为正确并成功运行。
这是因为编译器的优化。如果我通过将优化级别设置为O0来删除所有优化,则汇编代码完全正常,并且没有分段错误。