2017-03-23 5 views
0

Dies ist das C-Programm für die Warteschlange. Ich habe es gerade für Einfügewerte geschrieben. Das Problem, das ich bekomme, ist, dass ich Segmentierungsfehler bekomme, wenn ich das erste Element einfüge.Warum dieses Programm einen Segmentierungsfehler in diesem Warteschlangenprogramm gibt

#include <stdio.h> 
#include <malloc.h> 
struct node{ 
     int data; 
    struct node *next; 
}; 

struct queue { 
    struct node *front; 
    struct node *rear; 
}; 

struct queue *q; 

void create_queue(struct queue *); 
struct queue *insert(struct queue *,int); 

int main() 
{ 

int val, option; 
create_queue(q); 

do 
{ 

printf("\n *****MAIN MENU*****");  
printf("\n 1. INSERT");  
printf("\n Enter your option : "); 
scanf("%d", &option); 

switch(option) 
     { 
      case 1:    
           printf("\n Enter the number to insert in the queue:"); 
       scanf("%d", &val); 
       q = insert(q,val); 
       break; 

     } 

}while(option != 5); 

return 0; 
} 

void create_queue(struct queue *q) 
{ 
    q = (struct queue *)malloc(sizeof(struct queue)); 
    q->rear = NULL;//how this happened without any error?? 
    q->front = NULL; 
} 

struct queue *insert(struct queue *q,int val) 
{ 

struct node *ptr; 

ptr = (struct node*)malloc(sizeof(struct node)); 
if(ptr == NULL) 
{ 
    printf("error in allocating\n"); 
    return -1; 
} 
    ptr->data = val; 
    if(q->front == NULL) 
    { 
     q->front = ptr;//here I get segmentation fault 
     q->rear = ptr; 
     q->front->next = q->rear->next = NULL; 
    } 
    else 
    { 
     q->rear->next = ptr; 
     q->rear = ptr; 
     q->rear->next = NULL; 
    } 

return q; 
} 

Was ist falsch an meinem Programm? Warum funktioniert die Zuweisung eines neuen Knotens nicht, wie lautet die aktuelle Syntax?

+4

'create_queue()' macht alle lokalen Änderungen ..... –

+0

q ist ein Zeiger hier. Änderungen an den Elementen werden somit gespeichert. Ist es nicht? – acidlategamer

+0

Der Speicher, der in 'create_queue' zugewiesen wurde, wird nirgends zurückgegeben, sodass Sie undefiniertes Verhalten verursachen, indem Sie q verwenden, wenn es nicht zugewiesen wurde. Wenn Sie Zeile für Zeile mit einem Debugger fortfahren, wird dies auf einfache Weise angezeigt. Gib entweder den Zeiger zurück oder benutze '**' –

Antwort

1

Das Problem hier ist, während Sie Funktionen mit der globalen Variablen aufrufen und akzeptieren, dass in einem Funktionsparameter der Funktionsparameter lokal für die aufgerufene Funktion wird.

Auf diese Weise schattiert die lokale Variable die globale Variable, und da C Pass-by-Value für die Übergabe von Funktionsargumenten verwendet, werden Änderungen an der lokalen Kopie sowieso nicht auf den Aufrufer reflektiert.

Schließlich bleibt der globale Zeiger p nicht initialisiert. Versuch, Dereferenzierung, verursacht undefined behavior.

Sie entweder

  • brauchen nicht die globale (n) als Parameter übergeben
  • die Adresse des Zeigers übergeben und auf derselben innerhalb der Funktion arbeiten.

Das sagte please see this discussion on why not to cast the return value of malloc() and family in C..

+0

ja das Programm funktioniert, wenn ich malloc vor dem Aufruf create_queue (q) – acidlategamer

+1

@acidlategamer So vermeiden Sie das Problem mit Shadowing. :) –

Verwandte Themen