为什么我的代码在C中出现进程错误0xc0000005

为什么我的代码在C中出现进程错误0xc0000005,c,C,这个项目是一个学校作业的天际线项目,当我输入坐标时,我得到一个错误,这个错误是0xc0000005。 如果我没有错的话,其他的一切都很顺利。 如果有人能向我解释为什么会发生这种情况,我将不胜感激 #include <stdlib.h> typedef struct { int registerednumber; // It registers the number of buildings used in the array of buildings; } register

这个项目是一个学校作业的天际线项目,当我输入坐标时,我得到一个错误,这个错误是0xc0000005。 如果我没有错的话,其他的一切都很顺利。 如果有人能向我解释为什么会发生这种情况,我将不胜感激

#include <stdlib.h>

typedef struct {
    int registerednumber; // It registers the number of buildings used in the array of buildings;
} registernumber;

typedef struct
{
    int li;//POINT MOST TO THE LEFT
    int hi;//HEIGHT OF THE BUILDING
    int ri;//POINT MOST TO THE RIGHT
} buildings;

void exitprogram(){
    exit(0);
}

int menu() {
    int optioninmenu=0;
    do {
        system("cls");
        fflush(stdin);
        printf("-------------SKYLINES------------- \n");
        printf(" 1-REGISTER NUMBER OF BUILDINGS \n");
        printf(" 2-REGISTER BUILDING COORDINATES \n");
        printf(" 3-EXECUTE SKYLINE \n");
        printf(" 4-CREDITS \n");
        printf(" 5-EXIT \n \n");
        printf(" TYPE YOUR OPTION: ");
        scanf("%d", &optioninmenu);
    } while(optioninmenu!= 1 && optioninmenu!= 2 && optioninmenu!= 3 && optioninmenu!= 4 && optioninmenu!= 5 && optioninmenu!=0);
    return(optioninmenu);
}

int credits() {
    int returntomenu = 0;
    system("cls");
    printf(" ################################ \n");
    printf(" #This program was done by:     #\n");
    printf(" #Joao Moura A93099             #\n");
    printf(" #Eva Castro A93097             # \n");
    printf(" ################################ \n \n");
    printf("\n TYPE ENTER TO RETURN TO THE MAIN MENU");
    getchar();
    return menu();
}

int countbuildings(buildings *building, int *regnumberofbuildings) {
    int returntomenu = 0;
    int i=0;
    int numberofbuildings=0;
    system("cls");
    printf(" TYPE IN THE NUMBER OF BUILDINGS: ");
    scanf("%d", &numberofbuildings);
    *regnumberofbuildings=numberofbuildings;
    printf("%d",*regnumberofbuildings);
    printf("\n TYPE ENTER TO RETURN TO THE MAIN MENU");
    getchar();
    return menu();
}

int coordinates(buildings *building,int regnumberofbuildings) {
    int i=0;
    building=(buildings *)malloc(regnumberofbuildings*sizeof(building));
    system("cls");
    printf("%d",regnumberofbuildings);
    for(i=0;i!=regnumberofbuildings;i++){
        system("cls");
        printf("Building number %d \n \n", i+1);
        printf(" TYPE THE LEFTMOST COORDINATE: ");
        scanf("%d", &building[i].li);
        printf("\n TYPE IN THE HEIGHT OF THE BUILDING: ");
        scanf("%d", &building[i].hi);
        printf("\n TYPE THE RIGHTMOST COORDINATE: ");
        scanf("%d", &building[i].ri);
    }
    printf("\n TYPE ENTER TO RETURN TO THE MAIN MENU");
    getchar();
    return menu();
}

int main()
{
    int numberofbuildings=0;
    int registerednumber=0;
    buildings *building;
    int option=0;
    int i=0;
    do{
        option=menu();
        if(option==1){
            countbuildings(building,&numberofbuildings);
        }
        if(option==2){
            coordinates(building,numberofbuildings);
            getchar();
        }
        if(option==4){
            credits();
        }
    }while(option!=5);
    if(option==5){
        printf("Thanks for using our program!");
        printf("Press enter to leave the program");
        getchar();
        exitprogram();
    }
    return 0;
}
#包括
类型定义结构{
int registerednumber;//它注册建筑物数组中使用的建筑物数量;
}注册编号;
类型定义结构
{
int li;//指向最左边
int hi;//建筑物的高度
int ri;//指向最右边
}建筑物;
void exitprogram(){
出口(0);
}
int菜单(){
int optioninmenu=0;
做{
系统(“cls”);
fflush(stdin);
printf(“--------------天际线-------------------\n”);
printf(“1-建筑物登记编号”);
printf(“2-注册建筑坐标\n”);
printf(“3-executeskyline\n”);
printf(“4学分”);
printf(“5-EXIT\n\n”);
printf(“键入您的选项:”);
scanf(“%d”和选项菜单);
}而(optioninmenu!=1&&optioninmenu!=2&&optioninmenu!=3&&optioninmenu!=4&&optioninmenu!=5&&optioninmenu!=0);
返回(选项菜单);
}
国际学分(){
int returntomenu=0;
系统(“cls”);
印刷体;
printf(“此程序由以下人员完成:#\n”);
printf(“Joao Moura A93099\n”);
printf(“伊娃·卡斯特罗A93097”);
印刷体;
printf(“\n键入ENTER返回主菜单”);
getchar();
返回菜单();
}
int countbuildings(建筑物*建筑物,int*regnumberofbuildings){
int returntomenu=0;
int i=0;
int numberofbuildings=0;
系统(“cls”);
printf(“输入建筑物数量:”);
scanf(“%d”、&numberofbuildings);
*regnumberofbuildings=建筑物数量;
printf(“%d”,*regnumberofbuildings);
printf(“\n键入ENTER返回主菜单”);
getchar();
返回菜单();
}
整数坐标(建筑物*建筑物,整数regnumberofbuildings){
int i=0;
建筑物=(建筑物*)malloc(登记建筑物数量*建筑物尺寸);
系统(“cls”);
printf(“%d”,regnumberofbuildings);
对于(i=0;i!=regnumberofbuildings;i++){
系统(“cls”);
printf(“建筑编号%d\n\n”,i+1);
printf(“键入最左边的坐标:”);
scanf(“%d”,&building[i].li);
printf(“\n键入建筑物的高度:”);
scanf(“%d”,&building[i].hi);
printf(“\n键入最右边的坐标:”);
scanf(“%d”,&building[i].ri);
}
printf(“\n键入ENTER返回主菜单”);
getchar();
返回菜单();
}
int main()
{
int numberofbuildings=0;
int registerednumber=0;
建筑物*建筑物;
int选项=0;
int i=0;
做{
选项=菜单();
如果(选项==1){
countbuildings(建筑物和建筑物数量);
}
如果(选项==2){
坐标(建筑物、建筑物数量);
getchar();
}
如果(选项==4){
学分();
}
}while(选项!=5);
如果(选项==5){
printf(“感谢您使用我们的程序!”);
printf(“按回车键退出程序”);
getchar();
exitprogram();
}
返回0;
}

在函数坐标中,您将建筑变量用作局部变量,因此不会分配外部变量。您的定义应该是int坐标(buildings**building,int regnumberofbuildings),您应该称之为坐标(&building,numberofbuildings);您可以创建局部临时变量并使用它,然后将其分配给应该传递到函数Welcome to SO中的引用。使用带有可变参数列表的函数而不提供原型是一个坏主意。对于
printf
您应该包括
stdio.h
。您的编译器应该对使用没有原型的函数提出一些警告(隐式声明…)。因此,您应该启用所有警告。在该学校项目中,您应该学习最新的C标准。空参数列表已弃用,不应用于新代码。sizeof(building)==sizeof(void*)。您分配了错误的字节数。它应该是malloc(regnumberofbuildings*sizeof(buildings));除了前面的注释外,您还应该阅读并修改代码,使之成为一个强调最小化的代码,即删除所有不需要重现问题的代码。例如,不需要所有这些吨的印刷品来证明问题。这将使每个人都更容易阅读,并且作为一个积极的副作用,你可能已经在这个过程中发现了你的问题。