Lỗi Segmentation fault trong ngăn xếp stack

Mình có 1 bài tập viết cấu trúc vehicule ( xe oto) bằng stack trên Linux nhưng chạy bị lỗi Segmentation fault lúc thêm phần tử vào stack

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct vehicule{
 char nom_modele[20]; // Tên xe
 int puissance; // Phân khối của xe ( cai nay gia tri ngau nhien tùy mình muốn)
 float vitesse_max; // Tốc độ tối đa (tương tự phân khối)
}vehicule;
typedef struct
{
 int nbVehicule;
 vehicule **tpv;//tpv là mảng các con trỏ kiểu vehicule 
} pilevehicule;
void saisie_vehicule(vehicule *p) //nhap thong tin xe vao
{
 printf("Entrew le nom modele : \n");
 scanf("%s",p->nom_modele);
 srand(time(NULL));
 p->puissance=rand()%(301); 
 p->vitesse_max=rand()%(251);
}
pilevehicule *init_pilevehicule() //tạo stack
 {
 pilevehicule *p;
 p=(pilevehicule *)malloc(sizeof(pilevehicule));
 p->nbVehicule=0;
 return (p);
}
void empile_vehicule(pilevehicule *p,vehicule *v){
 p->tpv[p->nbVehicule]=v;
 p->nbVehicule++;
}
void affiche_pilevehicule(pilevehicule *p) //hiển thị các phần tử trong stack ra
{
 printf("nb Vehicule: %d \n", p->nbVehicule);
 int i;
 for(i=0;i <= p->nbVehicule;i++){
  vehicule *a;
  a= p->tpv[i];
  printf("vehicule %i nom modele est: %s \n", i+1, a->nom_modele);
  printf("la puissance est %d \n ",a->puissance);
  printf("la vitesse max est %f \n ", a->vitesse_max);
 }
}
vehicule *depile_vehicule(pilevehicule *p)//lấy phần tử đỉnh ra
{
 vehicule *a;
 a=(vehicule *)malloc(sizeof(vehicule));
 a=p->tpv[p->nbVehicule];
 --p->nbVehicule;
 return a;
}
void affiche_vehicule(vehicule *v)//hiển thị thuộc tính của xe ra
 {
 printf("modele de cette vehicule est:%s \n",v->nom_modele);
 printf("la puissance est %d \n",v->puissance);
 printf("la vitesse max est %f \n ", v->vitesse_max);
}
void supprime_pilevehicule(pilevehicule *p) //giải phóng bộ nhớ
 {
 free(p);
}
int main(){
 vehicule *v1, *v2, *v3;
 v1 =(vehicule *)malloc(sizeof(vehicule));
 v2 =(vehicule *)malloc(sizeof(vehicule));
 saisie_vehicule(v1); //nhập thuộc tính vào
 saisie_vehicule(v2); // tương tự nhập thuộc tính vào
 pilevehicule *pv; 
 pv=init_pilevehicule(); //tạo stack
 empile_vehicule(pv, v1); //đưa v1 vào stack pv
 empile_vehicule(pv, v2);//đưa v2 vào stack pv
 affiche_pilevehicule(pv); // sau khi đưa thì hiển thị các phần tử của mảng ra
 v3 = depile_vehicule(pv); // lấy phần tử trên cùng của stack, đem ra lưu vào v3
 affiche_vehicule(v2); // hiển thị thông tin của xe v2
  printf("\n\nPile après suppression\n\n"); // stack sau khi bỏ v2 đi
 affiche_pilevehicule(pv); //hiện stack sau khi bỏ v2 đi
 supprime_pilevehicule(pv); // giải phóng toàn bộ bộ nhớ của pv
 affiche_pilevehicule(pv); //hiển thị ra stack sau khi giải phóng bộ nhớ
 return 0;
}

Em bị lỗi chỗ empile_pilevehicule ( đưa vào stack) và depiler_pilevehicule (lấy ra stack), em hiểu vấn đề nhưng không biết làm thế nào
Lúc empile_pilevehicule(pv,v1), e không biết làm sao để thèn tpv (trong pv) trỏ đến v1 để lưu lại các thuộc tính ( tên xe, phân khối, tốc độ tối đa)
Phần code, em nghĩ có vấn đề nằm ở 2 thèn fonction đó


pilevehicule *init_pilevehicule() //tạo stack
 {
 pilevehicule *p;
 p=(pilevehicule *)malloc(sizeof(pilevehicule));
 p->nbVehicule=0;
 return (p);
}

Chào Thanh_Hai_Dinh!
Bạn học lập trình C lâu chưa?
Hàm này của bạn gặp vấn đè nek!
Và thêm 1 số ý kiến chủ quan của mình nha! Bạn nên dùng biến ngắn gọn xúc tích!

1 Like

Câu này rất đáng quan ngại :slight_smile: tên vầy được rồi, chẳng qua phải tra từ điển thôi.

2 Likes

vehicle chứ =)))))))))))))))))))))))))))

Tên biến tiếng Pháp nhé.

2 Likes

Tại em cứ nghĩ bạn ý dùng tiếng Anh :v

Anh ơi! Hàm pilevehicule *init_pilevehicule() bên C là viết sai hoàn toàn!

Chào Thanh_Hai_Dinh!

bạn vào link: https://drive.google.com/drive/folders/0B42wsjSbxHg8TFJxbl9PdWtESzA và tải pointers in C và đọc thì bạn sẽ hiểu tại sau bạn sai! Đọc phần: Common Mistakes trang 106.Chúc bạn thành công!

Đúng vậy :sweat_smile:

Ngoài ra hai câu cuối là sai: đã free rồi nhưng lại truy cập.

1 Like

minh moi hoc ban oi :frowning:

ten bien tieng phap, toan bo code deu tieng phap ban oi :smiley:

1 Like
 supprime_pilevehicule(pv); // giải phóng toàn bộ bộ nhớ của pv
 affiche_pilevehicule(pv); //hiển thị ra stack sau khi giải phóng bộ nhớ

hai cau nay a ban

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?