2017-12-09 31 views
-3

여기 내 코드가 있는데, 세분화 오류가 발생하고 이유를 모르겠다 ... 'n'크기의 격자를 만들고 있는데, 'tab'은 그의 형식이 cellule 인 배열이다. 셀은 2 개의 값을가집니다. 그래서 'creer_grille'함수에서 malloc (크기는 4 6 또는 8이 될 수 있음) 배열을 만들고 -1과 0으로 셀 값을 초기화합니다. 다음 함수에서 'creer_grille' 기능. 당신의 creer_grille 기능에왜 이것이 나에게 세그 폴트를 줘?

typedef struct 
{ 
    int val; 
    int initial; 
} cellule; 

typedef struct 
{ 
    cellule *tab; 
    int  n; 
} grille; 

grille *creer_grille(int n) 
{ 
    grille *g; 
    int i; 

    assert(n == 4 || n == 6 || n == 8 && "Taille de la grille différent de 4,6 ou 8"); 
    g->n = n; 
    g = malloc(sizeof(int) * (n*n)); 
     if (g->tab == NULL) 
       exit(-1); 
    for (i = 0; i < n*n; i++) 
     { 
     g->tab[i].val = -1; 
     g->tab[i].initial = 0; 
     } 
     return g; 
} 

void detruire_grille(grille * g) 
{ 
    free(g); 
} 

void test_creer_grille(){ 
    int i,k; 
    for(k = 4; k <= 8 ; k+=2){ 
     grille * g = creer_grille(k); 
     assert(g->n == k && "Problème dans le champ n de la grille"); 

     //Vérification que les cellules sont vides 
     for(i = 0 ; i < k * k ; i++){ 
      assert(g->tab[i].val == -1 && "Problème : cellule non vide !"); 
      assert(g->tab[i].initial == 0 && "Problème : cellule initiale !"); 
     } 
     detruire_grille(g); 
    } 
    printf("Test de la fonction creer_grille OK !\n"); 
} 

int main() 
{ 
    test_creer_grille(); 
} 

답변

0

몇 가지 문제가 있습니다.) 고정 코드

grille *creer_grille(int n) 
{ 
    grille *g = malloc(sizeof(grille)); // A <=== Allocate Grille 
    int i; 

    assert((n == 4 || n == 6 || n == 8) // B <===() 
     && "Taille de la grille différent de 4,6 ou 8"); 
    g->n = n; 
    g->tab = malloc(sizeof(cellule) * (n*n)); // C <=== sizeof(cellule) 
    if (g->tab == NULL) 
     exit(-1); 
    for (i = 0; i < n*n; i++) 
    { 
     g->tab[i].val = -1; 
     g->tab[i].initial = 0; 
    } 
    return g; 
} 

void detruire_grille(grille * g) 
{ 
    free (g->tab); // D <=== free first the Cellules 
    free(g); 
} 

설명

  • sizeof(cellule)하지 sizeof(int)
  • &&||
  • C보다 우선 순위가 있기 때문에)
  • B) 괄호가 필요하다 그릴을 할당 사용할 필요가 제안
  • D) Cellules도 해제해야합니다 (그릴 이전)
  • ,515,
1

, 당신은 g 포인터를 선언합니다. 초기화되지 않았으므로 쓰레기가 포함됩니다.

나중에 몇 줄을 입력하면 g (g->n)의 n 구성원에 액세스하려고 시도합니다. 현재까지도 g 포인터가 초기화되지 않았습니다. 따라서 분명한 이유로 인해 세그먼트 오류로 연결되는 가비지 위치에 액세스하려고 시도합니다.

사용하기 전에 가능한 g 포인터의 메모리를 할당하는 것이 좋습니다.

g = malloc(sizeof(grille));

나는 컴파일러가 초기화되지 않은 변수를 사용에 대해 경고했을 수도 있다고 생각한다.

0

문제점이 함수이다 : 가변 g 동적를 sizeof (INT)의 크기로 할당 creer_grille (INT 않음) N N

하지만 루프시는 미소 세포 필드 액세스 , 명시 적으로 할당되지 않았습니다. 할당 g이고 테스트 중입니다 (g-> tab == NULL). 이것은 calloc을 사용했다면 malloc이 할당 된 메모리를 0으로 설정하지 않았기 때문에 가능합니다. 문제가있는 것을 볼 수 있습니다.

n * n 번째 반복에서 cullule의 초기 필드를 설정하려고하면 세그먼트 화 오류가 발생합니다.