我正在写一个学校项目的程序,但我一直遇到"检测到严重错误c0000374"或"…触发了断点"。我试过调试,但没有成功。我还注意到,有时它会运行,其他时候它会在随机malloc上崩溃。下面是我的代码,它应该为电影和演员的每个电影生成链接列表。我对C没有太多经验。请帮忙。
typedef struct meno {
char meno[100];
char priezvisko[100];
}NAME;
typedef struct herec {
struct meno meno;
int rok_narodenia;
struct herec *dalsi;
}ACTOR;
typedef struct film {
char meno[100];
struct herec *herec;
int rok_vyroby;
struct meno meno_rezisera;
struct film *dalsi;
}MOVIE;
MOVIE* nacitaj() {
FILE* file;
int i = 1;
file = fopen("filmy.txt", "r");
if (file == NULL) {
printf("SUBOR SA NEPODARILO OTVORIT");
return NULL;
}
MOVIE* film = malloc(sizeof(MOVIE*));
MOVIE* head = film;
MOVIE* film_temp = NULL;
ACTOR* herec = NULL;
ACTOR* herec_temp = NULL;
char temp,temp2;
film->dalsi = NULL;
while ((temp = fgetc(file)) != EOF) {
if (temp != '*') {
//pre film
if (film->dalsi != NULL) {
herec->dalsi = NULL;
herec = NULL;
herec_temp = NULL;
film = film->dalsi;
film_temp = NULL;
}
if(film_temp == NULL){
film_temp = malloc(sizeof(MOVIE*));
film->dalsi = (MOVIE*)film_temp;
}
film->meno[0] = temp;
while ((temp = fgetc(file)) != 'n') {
film->meno[i] = temp;
i++;
}
i = 1;
fscanf(file, "%dn%s %sn", &film->rok_vyroby, film->meno_rezisera.meno, film->meno_rezisera.priezvisko);
herec = (ACTOR*)malloc(sizeof(ACTOR*));
film->herec = (ACTOR*)herec;
}
if (temp == '*') {
//pre herca
if (herec != NULL && herec->dalsi != NULL) {
herec = (ACTOR*)herec->dalsi;
herec_temp = NULL;
}
if (herec_temp == NULL) {
herec_temp = malloc(sizeof(ACTOR*));
herec->dalsi = (ACTOR*)herec_temp;
}
fscanf(file, "%s %s %dn", herec->meno.meno, herec->meno.priezvisko, &herec->rok_narodenia);
}
}
film->dalsi = NULL;
fclose(file);
return head;
}
malloc(sizeof(MOVIE*));
是错误的,因为您只分配了与指针大小一样多的字节,而不是与结构大小一样多。
然后你取消引用结构的字段,这样你就可以访问不属于你的内存。
您需要分配与结构需要一样多的字节
malloc(sizeof(MOVIE));
或者在这个特定的地方-但你在代码的其他地方也有同样的错误
MOVIE* film = malloc(sizeof(film*));
第二种方法(sizeof中的对象而不是类型(被认为更好,因为您可以在不更改sizeofs中的类型的情况下更改对象的类型。
您的malloc应该是:
MOVIE* film = malloc(sizeof(MOVIE));
sizeof(数据结构(,而不是指针。