2017-10-17 2 views
0

In C versuche ich Warteschlangen-Datenstruktur zu lernen und Zeiger auf struct, aber innerhalb der Struktur gibt es Zeiger auf Array. Hier queue struct ist, ist q Zeiger auf die Struktur, und im Inneren struct es rear, front, num und int *que (Zeiger auf Array-Daten zu speichern)Warteschlange mit struct, die auf Array zeigen

typedef struct { 
    int max; 
    int rear; 
    int front; 
    int num; 
    int *que; 
} queue; 

Und malloc() Verwendung

queue->que=malloc(sizeof(int)12) ; to make arrray And to access it, 
q->que[q->rear++] //not to familiar, 

Erste Ich deklariere Array nicht, aber kann ich auf Daten zugreifen, die von que unter Verwendung [] gezeigt werden? Ist das mittlere Zugriff que[q->rear++] innerhalb q Zeiger? Ist das das gleiche wie (q).que[q->rear++]? Ich habe einen Segmentierungsfehler.

Teil des Codes; aber es gibt einige Fehler

#include <stdio.h> 
#include <stdlib.h> 
typedef struct { 
    int max; 
    int num; 
    int front; 
    int rear; 
    int *que; 
} queue; 


int initialization(queue*q, int max) { 
    q->num = 0; 
    q->front = 0; 
    q->rear = 0; 
    if (q->que =(int*)malloc(max * sizeof(int)) == NULL) { // got pointer NULL i dont know why 
     q->max = 0; 
     return-1; 
    } 
    q->max=max; 
    return 0; 
} 


int main() { 
    queue que; 
    if (initialization(&que, 12) == -1) 
     printf("fail"); 
    else { 
     int m,x; 
     while (m != 0) { 
      printf("1.enque 2.deque. 3.peek 4.display 0. slese"); 
      scanf("%d", &m); 
      switch (m) { 
       case 0: break; 
       case 1: printf("data"); 
        scanf("%d", &x); 
        enqueue(&que, x); 
        break; 
       case 2: dequeue(&que, &x); 
        printf("%d is dequeue", x); 
        break; 
       case 3:x=peek(&que,&x); 
        printf("max now is %d", x); 
        break; 
       case 4:display(&que); 
     } 
    } 
} 

int enqueue(queue*q, int x) { 
    if (q->num >= q->max) 
     return -1; 
    else{ 
     q->num++; 
     q->que[q->rear++]= x; //got segmentation fault 
     if (q->rear == q->max) 
      q->rear = 0; 
    } 
} 
+0

Setzen Sie '#include ' – BLUEPIXY

+2

Zuerst bitte formatieren Sie Ihren Code mit regulären Einzug; ohne es ist Ihr Code * sehr * schwer zu lesen. Zweitens: 'if (q-> que = (int *) malloc (max * sizeof (int)) == NULL)' macht nicht, was Sie wegen der Vorrangstellung des Operators tun sollen; das ist effektiv 'q = (malloc() == NULL) ', so dass' q' als 0 oder 1 endet. Sie wollen stattdessen 'if ((q = malloc()) == NULL) '. Oh, und bitte ignoriere Compilerwarnungen nicht - 'm' wird zum Beispiel vor der Verwendung nicht initialisiert.Fix all diese Dinge dann sehen, wie das Programm funktioniert. –

+0

@Ken Y-N danke es funktioniert! anstelle von 'int * que' und malloc, um ein Array zu erstellen, kann ich einfach Array wie' int que [12] 'deklarieren und auf Daten mit' q-> que [] 'zugreifen? und auch, wenn ich schreibe "* (int) malloc (sizeof (int * 12)' brauche ich auch Cast? und für den Operator Vorrang -> und [] ist das gleiche und es wird von links nach rechts Reihenfolge. 'q- > que fiksx

Antwort

0

In Ihrer initialization() Funktion, während Zuordnungsspeicher mit malloc() wie

if (q->que =(int*)malloc(max * sizeof(int)) == NULL) { 

der (int*)malloc(max * sizeof(int)) Teil zuerst ausgewertet wird und dann dieser Wert verglichen wird NULL über den == Operator . Dies führt zu 0, wenn die Bedingung falsch ist und andernfalls 1.

Jetzt diese (0 oder 1) Wert wird anstelle des Rückgabewert von malloc() zu q->que zugeordnet. Also unter dem Strich ist q->que zeigt auf den Speicherort 0 (oder 1 als der Fall vielleicht), die höchstwahrscheinlich nicht ein Teil des Speichers ist, dass ein normales Programm darf mit durcheinander und damit erhalten Sie Fehler.

Sie diesen Operator Vorrang Problem wie

durch Verwendung von Klammern lösen können
if ((q->que = malloc(max * sizeof(int))) == NULL) { 

Und in Ihrer while Schleife m!=0 innerhalb main() ist die Steuer Ausdruck aber m nicht einmal während der ersten Iteration initialisiert wird. An diesem Punkt ist der Wert unbestimmt (Müllwert). zuerst wie

int m=1,x; 
while (m != 0) { 

Sie könnten m auf etwas anderes als 0 initialisieren Und in C, müssen Sie nicht den Wert abgegebenen malloc() zurückgegeben. Siehe here.

+0

Vielen Dank !! Ich habe noch eine Frage, eine [C++% max] Ich fand dies, wenn der Operator Vorrang ++ ist höher als% warum es ausführen% Zuerst dann ++? – fiksx

+0

@fiksx '++' selbst ist getan, bevor '%' der Präzedenzregel entspricht.Es ist jedoch Postfix '++'. So ist die Operation erst nach der Übernahme des Wertes daraus Verwenden Sie das Präfix '++', Sie können den Unterschied erkennen, wie 'a [++ c % max] '. –

+1

Okk vielen Dank !! Ja, wenn es ++ c ist, wird es zuerst inkrementieren und dann% ausführen. Danke für die Hilfe! – fiksx