queueInit()

queueInit()

por José Coelho de Pina -
Número de respostas: 1

Qual o problema com as implementações a seguir para a função queueInit()?

typedef struct queueNode  QueueNode;
typedef struct queueNode* Link;
struct queueNode { 
  Item conteudo; 
  Link prox; 
};

static Link inicio;

void 
queueInit() /* implementacao 1 */ 
{ 
  inicio = (Link) mallocSafe(sizeof *inicio);
  inicio = NULL;
}


void 
queueInit(Link inicio) /* implementacao 2 */ 
{ 
    inicio = (Link) mallocSafe(sizeof *inicio);
    inicio->prox = NULL;
}


Link
queueInit() /* implementacao 3 */ 
{ 
    QueueNode inicio;
    inicio.prox = NULL;
    return &inicio;
}

Link
queueInit() /* implementacao 4 */ 
{ 
    Link inicio = mallocSafe(sizeof *inicio);
    inicio->prox = NULL;
    return inicio;
}

 /* implementacao 5 */
typedef struct queueNode* Link;
struct queueNode { 
  Item conteudo; 
  Link prox; 
};

struct queue { /* aqui esta especificado o que e' */
  Link inicio; /* uma fila: dois apontadores para struct queueNode */
  Link fim;    
}; 

typedef struct queue *Queue;

Queue 
queueInit(int maxN) 
{ 
  Queue q = mallocSafe(sizeof *q); 
  q->inicio = mallocSafe(sizeof(struct queueNode)); 
  q->fim    = mallocSafe(sizeof(struct queueNode)); 
  return q;
}
Em resposta à José Coelho de Pina

Re: queueInit()

por Gustavo Chicato -

1. A função faz inicio receber um endereço alocado e logo em seguida anula isso o fazendo apontar para NULL. Supondo que a implementação seja com cabeça, deveria ser inicio->prox = NULL.

2. Aqui inicio é uma variável local. Como a função não devolve valor nenhum e não recebe nenhum ponteiro de Link, o endereço alocado é perdido ao término da função.

3. Não há nenhum malloc. A função cria uma struct local inicio cujo endereço é devolvido, mas a struct em si deixa de existir na saída da função. Periga dar Segmentation Fault.

4. Aparentemente nenhum. 

5. fim usualmente é apenas um ponteiro para o fim da lista, não outra cabeça. A terceira linha poderia ser substituída por q->fim = q->inicio.