01/10/2018, 11:54
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 :
");
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
", p->nbVehicule);
int i;
for(i=0;i <= p->nbVehicule;i++){
vehicule *a;
a= p->tpv[i];
printf("vehicule %i nom modele est: %s
", i+1, a->nom_modele);
printf("la puissance est %d
",a->puissance);
printf("la vitesse max est %f
", 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
",v->nom_modele);
printf("la puissance est %d
",v->puissance);
printf("la vitesse max est %f
", 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("
Pile après suppression
"); // 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 đó
Bài liên quan
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!
Câu này rất đáng quan ngại tên vầy được rồi, chẳng qua phải tra từ điển thôi.
vehicle chứ =)))))))))))))))))))))))))))
Tên biến tiếng Pháp nhé.
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
Ngoài ra hai câu cuối là sai: đã free rồi nhưng lại truy cập.
minh moi hoc ban oi
ten bien tieng phap, toan bo code deu tieng phap ban oi
hai cau nay a ban