2013-05-21 2 views
0

Я бегу код на сайте кодирования и получил следующие ошибки:Assertion :: таНос

решение: malloc.c: 2369: SysMalloc: Утверждение `(old_top == (((mbinptr) (((полукокса *) & ((av) -> bins [((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) & & old_size == 0) || ((unsigned long) (old_size)> = (unsigned long) ((((__ builtin_offsetof (struct malloc_chunk, fd_nextsize)) + ((2 * (sizeof (size_t))) - 1)) & ~ ((2 * (sizeof (size_t))) - 1))) & & ((old_top) -> размер & 0x1) & & ((неподписанных долго) old_end & pagemask) == 0)»не удалось. Прерванный (ядро сбрасывали)

Код:

#include <stdio.h> 
#include <string.h> 
#include <math.h> 

typedef struct cell 
{ 
    int x; 
    int y; 
    struct cell *prevcell; 
    struct cell *nextcell; 
}cell; 


/* Head ends here */ 
void nextMove(int x, int y, int pacman_x, int pacman_y, int food_x, int food_y, char grid[x][y]){ 
    //logic here  
    int i=pacman_x; 
    int j=pacman_y; 


    cell *top,*node; 
    top = NULL; 

    while(grid[i][j] != '.') 
    { 
     node = NULL; 
     //UP 
     if(i != 0 && grid[i-1][j] != '%') 
     { 
      if(grid[i][j] != 'd') 
      { 
       printf("%d %d\n",i,j); 
       grid[i][j]='d'; 
      } 
      //push 
      node = (cell*)malloc(sizeof(node)); 
      node->x=i; 
      node->y=j; 
      node->prevcell=top; 
      node->nextcell=NULL; 
      if(top != NULL) 
       top->nextcell=node; 
      top=node; 

      i=i-1; 
     } 
     //LEFT 
     else if(j != 0 && grid[i][j-1] != '%') 
     { 
      if(grid[i][j] != 'd') 
      { 
       printf("%d %d\n",i,j); 
       grid[i][j]='d'; 
      } 
      //push 
      node = (cell*)malloc(sizeof(node)); 
      node->x=i; 
      node->y=j; 
      node->prevcell=top; 
      node->nextcell=NULL; 
      if(top != NULL) 
       top->nextcell=node; 
      top=node; 

      j=j-1; 
     } 
     //RIGHT 
     else if(j != y-1 && grid[i][j+1] != '%') 
     { 
      if(grid[i][j] != 'd') 
      { 
       printf("%d %d\n",i,j); 
       grid[i][j]='d'; 
      } 
      //push 
      node = (cell*)malloc(sizeof(node)); 
      node->x=i; 
      node->y=j; 
      node->prevcell=top; 
      node->nextcell=NULL; 
      if(top != NULL) 
       top->nextcell=node; 
      top=node; 

      j=j+1; 
     } 
     //DOWN 
     else if(i != x-1 && grid[i+1][j] != '%') 
     { 
      if(grid[i][j] != 'd') 
      { 
       printf("%d %d\n",i,j); 
       grid[i][j]='d'; 
      } 
      //push 
      node = (cell*)malloc(sizeof(node)); 
      node->x=i; 
      node->y=j; 
      node->prevcell=top; 
      node->nextcell=NULL; 
      if(top != NULL) 
       top->nextcell=node; 
      top=node; 

      i=i+1; 
     } 
     else 
     { 
      //pop 
      top=top->prevcell; 
      free(top->nextcell); 
      i=top->x; 
      j=top->y; 
     } 
    } 

} 
/* Tail starts here */ 
int main() { 

    int x, y; 
    int pacman_x, pacman_y; 
    int food_x, food_y; 
    scanf("%d %d", &pacman_x, &pacman_y); 
    scanf("%d %d", &food_x, &food_y); 
    scanf("%d %d", &x, &y); 
    char grid[x][y]; 

    for(int i=0; i<x; i++) { 
     scanf("%s[^\\n]%*c", grid[i]); 
    } 
    nextMove(x, y, pacman_x, pacman_y, food_x, food_y, grid); 
    return 0; 
} 

Я не получаю эту проблему. Может кто-нибудь помочь?

ответ

0

Ох .. У меня проблема.

Следующая таНос вызов неверен:

 node = (cell*)malloc(sizeof(node)); 

Он будет выделять только 4 байта (узел является указателем).

Правильная версия будет:

 node = (cell*)malloc(sizeof(*node)); 

ИЛИ

 node = (cell*)malloc(sizeof(cell)); 

Как глупо с моей стороны .. !!

0

Ваш формат scanf() неверен.

scanf("%s[^\\n]%*c", grid[i]); 

Это говорит Scanf() для
1) строка (% S)
2) символ '['
3) символ '^'
4) символ ' \»
5) символ 'п'
6) символ ']'
7) символ (% * с), но не храните его
Вы можете отказаться от 'S'

scanf("%[^\\n]%*c", grid[i]); 

Идея:

char buf[80]; 
fgets(buf, sizeof(buf)-1, stdin); 
sscanf(buf, "%[^\\n]", grid[i]); 

Я считаю, что безопаснее отдельный вход с разбора.

Кроме того, у вас есть

char grid[x][y]; 

Это, как представляется, распределение динамически из «сетки» на основе размера х & у. Это не C (если только это не новая функция). Поэтому мне нужно спросить, какой компилятор вы используете?

+0

Привет, спасибо за ваш ответ. Проблема заключается в Hackerrank.com. Они используют следующий компилятор: gcc 4.7.3, режим C99.Работает формат scanf() и распределение сетки. Фактически, все, начиная с комментария «Tail Starts here», добавляется самим сайтом. – user2407394

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

  • Нет связанных вопросов^_^