2014-01-22 4 views
0

У меня возникли проблемы со следующим кодом. newrows - это параметр, который непосредственно передается функции, в которой я работаю. Элементы вычисляются бит раньше, используя другой параметр. Так или иначе, для некоторых комбинаций значений для newrows и elements я получаю дамп ядра, тогда как другие комбинации работают нормально. Обычно, когда возникает свалка ядра, от 20000 до 25000 итераций. Однако, когда все работает нормально, было до 40000 итераций.свалка ядра при повторении через массивы

int32_t newimage[newrows][elements][3]; 
    int32_t pixelcounter[newrows][elements]; 

    //int32_t norm, angle, rohmax; 
    //double r, alpha, beta, m, mu; 



    //initialize arrays 

    for(i=0; i<newrows; i++){ 
     for(j=0; j<elements; j++){ 
      pixelcounter[i][j] = 0; 
      newimage[i][j][0] = 0; 
      newimage[i][j][1] = 0; 
      newimage[i][j][2] = 0; 

     } 
    } 

комбинация, которая работает отлично: 200: 188

комбинация, которая приводит к дампом памяти: 200: 376

Я использую Linux кстати :-)

ответ

0

Это, скорее всего, проблема стека. Обратите внимание, что newimage и pixelcounter выделяются в кадре стека любой функции, в которой они объявляются. Вы можете быстро пробежать пространство, пытаясь выделить большой объем данных. Ваш 3d newimage массив растет

#bytes = newrows * elemets * 3

я вымыл свою программу (хороший совет, чтобы попытаться и представить программы, которые компилируются, так могут люди могут помочь вам быстрее!):

#include <stdio.h> 
#include <stdint.h> 

void test(size_t newrows, size_t elements) { 
    int32_t newimage[newrows][elements][3]; 
    int32_t pixelcounter[newrows][elements]; 

    //initialize arrays 

    for(size_t i=0; i<newrows; i++) { 
     for(size_t j=0; j<elements; j++) { 
      pixelcounter[i][j] = 0; 
      newimage[i][j][0] = 0; 
      newimage[i][j][1] = 0; 
      newimage[i][j][2] = 0; 
     } 
    } 
} 

int main(void) { 
    printf("Size of integer = %ld\n", sizeof(int)); 
    for (size_t i = 700; ; i += 10) { 
      printf("Testing (%ld, %ld)\n", i, i); 
      test(i, i); 
    } 
    return 0; 
} 

и это работает, я вижу:

Size of integer = 4 
Testing (700, 700) 
Testing (710, 710) 
Testing (720, 720) 
Testing (730, 730) 
[3] 13482 segmentation fault (core dumped) ./a.out 

Так где-то между 720^2 * 3 * 4 и 730^2 * 3 * 4 байт, который является бит 6 MiB на моем 64-битном Linux-компьютере, он может быть другим на вашем компьютере.

Решение в этом случае распределяет ваши массивы в куче, где у вас будет гораздо больше памяти для работы. Более подробную информацию о многоразмерных массивах, распределяющих кучи, можно найти в How does C allocate space for a 2D (3D...) array when using malloc?.

Смежные вопросы