2014-03-30 27 views
0

我認爲螺柱()節目中途終止

struct stud 
{ 
    int flag; 
    char surname[90]; 
    int semester; 
}; 


int prepush(int *stack,int *head,int *n) 
{ 
int c,r; 
int *p; 
printf("[1].Add Student\n"); 
printf("[2].Add Proffesor\n"); 
do 
{ 
    printf("Pick:"); 
    scanf("%d",&c); 
    getchar(); 
}while(c!=1&&c!=2); 
switch(c) 
{ 
    case 1:p=stud();break; 
    case 2:p=prof();break; 
} 
r=push(stack,&head,&n,p); 
return r; 
} 

我不知道結束後終止該怎麼回這樣我就可以把它放在我的stack..adress還是什麼

int stud() 
{ 
    struct stud a,*p; 
    p=(void *)malloc(sizeof(a)); 
    p->flag=1; 
    printf("Give surname:"); 
    gets(p->surname); 
    printf("\nGive semester:") 
    scanf("%d",p->semester); 
    return p; 
} 

這就是我所說的 r = push(stack,& head,& n,p);

int push(int *stack,int *head,int *n,int *p) 
{ 
    if(*head==*n) 
    return 0; 
    stack[*head++]=p; 
    return 1; 
} 

其實我是想放入堆棧指針是指向結構

+0

如果你在64位系統上遇到很大麻煩,因爲int的大小是32位,而指針是64位。 –

+0

我在32位。 –

+2

你仍然不應該使用int來存儲指針。 –

回答

1

後面三個行是一個重大問題:

struct stud a,*p; 
p=(struct stud *)malloc(sizeof(a)); 
p=&a; 

在這裏你聲明瞭兩個局部變量ap,分配內存並使其指向p。你之後直接重新指派p指向a變量。這意味着你放棄了前一行分配的內存,並且有內存泄漏。

更糟糕的是,您然後將此指針返回給本地變量,並且您知道局部變量在返回時定義的函數超出範圍。那麼指針會指向什麼?使用此指針導致未定義的行爲

+0

好吧我看到..所以我可以放在我的堆棧,將顯示我從stud()創建的結構我應該返回什麼 –

+0

@KazaMaster你需要將'a'的內容複製到'那麼你可以返回你的代碼已經做過的'p'的地址。正如Joachim所指出的那樣,當前的代碼會拋棄分配的內存,並讓'p'指向函數結束時超出範圍的'a'的地址。 – alvits

+0

我做了一些改動 –