2016-05-16 4 views
1

Я немного смущен распределением памяти.Понимание распределения памяти и ошибки сбрасывания ядра

Я хочу заполнить структуру Судоку случайным числом, а затем проверить, правильно ли поле из 9 цифр.

#define SUDOKU_SIZE 9 
typedef struct 
{ 
    int grid[SUDOKU_SIZE][SUDOKU_SIZE]; 
} sudoku_t; 

int main(int argc, char const *argv[]){ 
    sudoku_t *s=malloc(sizeof s); 
    s->grid[0][0]=6;//manualy setting the value of the sudoku 
    ... 
    s->grid[8][8]=7; 
    fill_sudoku_test(s);//fill s, a feasible Sudoku with random number 
    int k, l; 
    for(k=0;k<SUDOKU_SIZE;k+=3){ 
     for(l=0;l<SUDOKU_SIZE;l+=3){ 
      if(correct_box(s,k,l))//check if a box of 3 by 3 contains 9 differents numbers 
       printf("Box correct at position :%d and %d\n",k,l); 
     } 
    } 
    free(s); 
    return EXIT_SUCCESS; 
} 

Когда я скомпилировал этот код, у меня возникла ошибка сбрасывания ядра.

Если кто-то получил решение, я заинтересован

EDIT

Вот те другие функции:

void fill_sudoku_test(sudoku_t *s){ 
    int k, l; 
    time_t t; 
    srand((unsigned) time(&t)); 
    for(k=0;k<SUDOKU_SIZE;k++){ 
     for(l=0;l<SUDOKU_SIZE;l++){ 
      if(!(s->grid[k][l])) { 
       s->grid[k][l]=rand()%SUDOKU_SIZE+1; 
      }    
     } 
    } 
} 


int correct_tab(int value[]){ 
    int i; 
    int tab[9]; 
    for(i=0;i<SUDOKU_SIZE;i++){ 
     tab[i]=0; 
    } 
    for(i=0;i<SUDOKU_SIZE;i++){ 
     if(tab[value[i]-1]==1){ 
     return 0; 
     } 
     else{ 
     tab[value[i]-1]=1; 
     } 
    } 
    return 1; 
} 

int correct_box(sudoku_t *s, int i, int j){ 
    int tab[SUDOKU_SIZE]; 
    int count=0; 
    int k,l; 
    for(k=0;k<3;k++){ 
     for(l=0;l<3;l++){ 
     tab[count]=s->grid[i+k][j+l]; 
     } 
    } 
    return (correct_tab(tab)); 
} 
+0

Вы, вероятно, отсутствует выделение сетки? Поместите структуру 'sudoku_t'. И код 'fill_sudoku_test'. – LPs

ответ

5
sudoku_t *s=malloc(sizeof s); 

должно быть

sudoku_t *s=malloc(sizeof(sudoku_t)); 

или

sudoku_t *s=malloc(sizeof(*s)); 

РЕДАКТИРОВАТЬ

в функции correct_tabvalue[i] может быть (и) 0. Тогда:

tab[value[i]-1]=1; 

и

if(tab[value[i]-1]==1) 

доступ массив из границ.

EDIT 2

correct_tab В value массиве не intited для всей SUDOKU_SIZE то некоторые значения массива не определены.

Вы можете, по крайней мере, объявить его как:

int tab[SUDOKU_SIZE] = {0}; 

EDIT3

Чтобы ответить на Ваши комментарии:

Ваш INIT правильно: Инициализационные числа между 1 в 9 ,

Проблема заключается в том, что correct_tab вызывается из correct_box минус tab, локальный (распределенный стек) массив. Это означает, что 1 главное:

  • его значение не itited 0. Тех значений является Randoms из-за выделения стека.

используя код EDIT2, вы можете установить 0 для всех значений массива.

BTW ваша функция correct_tab выполняет цикл целых табуляций, где только некоторые значения извлекаются из вашей структурной матрицы sudocu_t. Это случилось из-за:

  1. count переменная в correct_box функция всегда 0. Вы должны указывать его каждый раз, когда вы устанавливаете значение в массив tab.
  2. Вы должны передать значение count функции correct_tab, чтобы разрешить цикл только для реальных вставленных значений.
+0

По-прежнему не работает ... – Cariamole

+0

Как я уже говорил, отправляйте другие функции. Где срабатывает ядро ​​ядра? – LPs

+0

Хорошо, я сделал это. И ядро ​​сбрасывается после fill_sudoku_test – Cariamole

1

Когда вы выделяете:

sudoku_t *s=malloc(sizeof s); 

Это только выделяет память, достаточную для хранения указатель. Вы, наверное, имели в виду:

sudoku_t *s=malloc(sizeof(*s)); 

Кроме этого, вам нужно будет использовать отладчик, чтобы определить, какая часть кода на самом деле вызвало ошибку сегментации.

0

Первая проблема заключается в этой строке:

sudoku_t *s=malloc(sizeof s); 

что означает таНос выделяет память, равную размеру указателя, который может быть 4 байта или 8 байт в зависимости от машины.

В идеале, что у ¨R ожидая выделяет размер структуры, так что это должно быть:

sudoku_t *s = (sudoku_t *) malloc(sizeof(sudoku_t)); 
+0

[do-i-cast-the-result-of-malloc?] (Http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc) – LPs

+0

Обычно в соответствии с прототипом malloc, он возвращает указатель void. Поэтому я считаю, что это хорошо, чтобы отличить его от типа структуры. –

+0

Взгляните на связанную почту SO. Это дает вам всю информацию. – LPs

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