Cではキューのデータ構造を学習し、構造体へのポインタを作成しようとしますが、構造体内には配列へのポインタがあります。ここqueue
、構造体であるq
は、構造体へのポインタであり、構造体の内部にまず配列を指す構造体を使用するキュー
queue->que=malloc(sizeof(int)12) ; to make arrray And to access it,
q->que[q->rear++] //not to familiar,
を用いrear
、front
、num
及び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;
}
}
'#include ' –
BLUEPIXY
まず、コードを通常のインデントでフォーマットしてください。そのコードがなければ、あなたのコードは読みにくい*非常に*です。第2に、if(q-> que =(int *)malloc(max * sizeof(int))== NULL) 'は演算子の優先順位のためにしたいことをしません。これは効果的に 'q =(malloc()== NULL)'なので、 'q'は0または1になります。' if((q = malloc())== NULL) 'を代わりに使います。ああ、コンパイラの警告を無視しないでください。たとえば、 'm'は使用前に初期化されていません。これらのことをすべて修正し、プログラムの仕組みを見てください。 –
@Ken Y-Nありがとうございます!配列を作るために 'int * que'とmallocの代わりに、' int que [12] 'のような配列を宣言し、' q-> que [] 'でデータにアクセスできますか? '*(int)malloc(sizeof(int * 12)'を書くと、キャストも必要ですか?演算子の優先順位 - >と[]は同じで左から順になります。 '' que'は最初に評価されます[]、私はそうでしょうか? – fiksx