2017-10-17 4 views
0

Cではキューのデータ構造を学習し、構造体へのポインタを作成しようとしますが、構造体内には配列へのポインタがあります。ここqueue、構造体であるqは、構造体へのポインタであり、構造体の内部にまず配列を指す構造体を使用するキュー

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

を用いrearfrontnum及びint *que(データを格納する配列へのポインタ)

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

そしてmalloc()があります私は配列を宣言していませんが、[]を使用してqueが指すデータにアクセスできますか? この平均アクセスque[q->rear++]qの中にありますか? これは(q).que[q->rear++]と同じですか?私はセグメンテーション違反を持っています。

コードの一部。しかし、いくつかのエラーがあるあなたinitialization()関数で

#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

'#include ' – BLUEPIXY

+2

まず、コードを通常のインデントでフォーマットしてください。そのコードがなければ、あなたのコードは読みにくい*非常に*です。第2に、if(q-> que =(int *)malloc(max * sizeof(int))== NULL) 'は演算子の優先順位のためにしたいことをしません。これは効果的に 'q =(malloc()== NULL)'なので、 'q'は0または1になります。' if((q = malloc())== NULL) 'を代わりに使います。ああ、コンパイラの警告を無視しないでください。たとえば、 'm'は使用前に初期化されていません。これらのことをすべて修正し、プログラムの仕組みを見てください。 –

+0

@Ken Y-Nありがとうございます!配列を作るために 'int * que'とmallocの代わりに、' int que [12] 'のような配列を宣言し、' q-> que [] 'でデータにアクセスできますか? '*(int)malloc(sizeof(int * 12)'を書くと、キャストも必要ですか?演算子の優先順位 - >と[]は同じで左から順になります。 '' que'は最初に評価されます[]、私はそうでしょうか? – fiksx

答えて

0

==オペレータ介しNULLに対してmalloc()

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

ような割り当てメモリは (int*)malloc(max * sizeof(int))部分が最初に評価されると、次いで、 この値を比較している間。条件がfalseの場合は 0、そうでない場合は 1となります。

この0又は1)値の代わりmalloc()の戻り値のq->queに割り当てられています。結論として、q->queは、通常のプログラムが混乱してエラーが発生する可能性があるメモリの一部ではないメモリ位置0(または場合によっては1)を指していることになります。

あなたは

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

そしてmain()中にあなたwhileループのように括弧を使用して、この演算子の優先順位の問題を解決することができ、制御式がm!=0ですがmであっても、最初の反復時に初期化されていません。その時点で、その値は不確定(ガベージ値)です。

あなたはmalloc()によって返された値をキャストする必要はありません、最初の

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

様およびCに0以外にmを初期化することができます。 hereを参照してください。

+0

ありがとうございました!もう1つの質問があります。[C++%max]演算子の優先順位++が%より高い場合、最初に++? – fiksx

+0

@fiksx '++'自体が優先ルールに従う '%'の前に行われますが、 '++'は後置されていますので、操作はその値を取った後にのみ行われます。接頭辞 '++ 'を使うと、違いを知ることができます。' a [++ c %max] 'となります。 –

+1

大丈夫ですよね!もしそれが++ cなら、最初にインクリメントして%を実行します。助けてくれてありがとう! – fiksx