2017-10-17 23 views
0

在C中,我尝试学习队列数据结构并将指针指向结构,但在结构内部存在指向数组的指针。这里queue是结构,q是指向struct和内部结构有rearfrontnumint *que使用使用指向数组的结构的队列

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

优先(指针数组来存储数据)

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

而且malloc()我没有声明数组,但我可以使用[]访问que指向的数据吗? 这是指里面q指针吗? 这和(q).que[q->rear++]一样吗?我得到了分段错误。

部分代码;但也有一些错误

#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

首先,请用正常的缩进格式化你的代码;没有它你的代码*非常*难以阅读。其次,'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

在你initialization()功能,同时分配内存malloc()

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

(int*)malloc(max * sizeof(int))部分首先通过==运营商评估,然后这个值进行比较反对NULL 。如果条件为false,则将导致0,否则将导致1

现在01)的值被分配给q->que代替malloc()返回值。因此,底线是q->que指向内存位置0(或根据情况可能为1),这很可能不是内存的一部分,正常程序可能会混淆,因此会出错。

您可以通过使用括号像

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

解决这个运算符优先级问题,并在里面main()while回路,控制表情是m!=0m不是第一次迭代时甚至初始化。在那个时候,它的值是不确定的(垃圾值)。

你可以初始化m0其他的东西像第一

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

而在C,你不必投用malloc()返回的值。见here

+0

Thankyou这么多!!我还有一个问题,我发现这个,如果运算符优先级++高于%为什么它执行%首先是++? – fiksx

+0

@fiksx'++'本身在'%'符合优先规则之前完成,但是它是后缀'++',所以只有在从中取得值之后才能完成操作。使用前缀'++',你可以区分它们。像'a [++ c %MAX]'。 –

+1

非常感谢你!是的,如果它是++ c,它会先增加然后执行%。谢谢您的帮助! – fiksx