код, генерирующий ошибку сегментации при запуске с флагом -m32

#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 so y 1 может быть равно PT_SIZE , что может быть за пределами массива vBit .

4. Разрешены ли непрерывные свободные страницы, на которых вы обнаружите, пересекать границы строк vBit ? Если нет, условие завершения для внутреннего цикла должно быть j < PT_SIZE - n .

5. Ну, это может быть актуально в зависимости от того, где происходит сбой. Если вы позволите функции завершиться, не вернув что-либо, а затем попытаетесь использовать возвращенный указатель, у вас будет неопределенное поведение . И UB с указателями очень часто приводит к сбоям. Вам действительно следует потратить некоторое время на изучение того, как отлаживать свои программы . И обработайте любое предупреждение, которое выдает вам компилятор, как ошибку, и исправьте его.