#c
#c
Вопрос:
У меня есть функция, которая отлично работает в 64-разрядном адресном пространстве, но при компиляции с флагом -m32 она выдает ошибку сегментации. Я понятия не имею, почему это может происходить. Любая помощь приветствуется.
int* getNextVPage(int n){
int i; int cont = 0; int x; int y;
for(i = 0; i < PD_SIZE; i ){
int j;
for( j = 0; j < PT_SIZE; j )
if(vBit[i][j] == 0){
if(cont == 0){x = i; y = j;} // finds n continuous free pages and returns the first one in the the sequence
cont ;
if(cont == n){
int l;
for(l = 0; l < n; l ){
vBit[x][y l] = 1;
}
int* ret = (int*) malloc(2*sizeof(int)); ret[0] = x; ret[1] = y;
return ret;
}
}
else{
cont = 0;
}
}
}
Комментарии:
1. Пожалуйста, предоставьте минимально полную программу. Могут ли ваши
_SIZE
макросы быть связаны с 32/64?2. Что произойдет, если внешний цикл завершится, что вы тогда вернете? Разве компилятор не жалуется на возможное отсутствие возврата значения? Возможно, вам следует включить более подробные предупреждения (например
-Wall
, и-Wextra
и, возможно, даже-pedantic
)?3. Предполагаю, что здесь отсутствуют некоторые фрагменты, но я отмечаю, что
y == j
soy 1
может быть равноPT_SIZE
, что может быть за пределами массиваvBit
.4. Разрешены ли непрерывные свободные страницы, на которых вы обнаружите, пересекать границы строк
vBit
? Если нет, условие завершения для внутреннего цикла должно бытьj < PT_SIZE - n
.5. Ну, это может быть актуально в зависимости от того, где происходит сбой. Если вы позволите функции завершиться, не вернув что-либо, а затем попытаетесь использовать возвращенный указатель, у вас будет неопределенное поведение . И UB с указателями очень часто приводит к сбоям. Вам действительно следует потратить некоторое время на изучение того, как отлаживать свои программы . И обработайте любое предупреждение, которое выдает вам компилятор, как ошибку, и исправьте его.