c语言结构体问题 关于内存分配问题


#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>


#define MAX 100
#define LEN sizeof(struct book)


typedef struct book
{
    char id[20];
    char name[30];
    float price;
}Book;

typedef struct List
{
    Book *eBook;
    int length;
}SqList;




void InitView()
{
    printf("\n\n\t%c %c %c %c %c %c %c %c %c %c %c  图 书 管 理 系 统 %c %c %c %c %c %c %c %c %c %c %c\n",
            26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27);
        printf("\t%c\t\t\t\t\t\t\t      %c\n",25,25);
        printf("\t%c\t\t\t\t\t\t\t      %c\n",25,25);
        printf("\t%c\t\t1. 查询图书( Purchase control )\t\t      %c\n",25,25);
        printf("\t%c\t\t\t\t\t\t\t      %c\n",25,25);
        printf("\t%c\t\t2. 删除图书(  price look up   )\t\t      %c\n",25,25);
        printf("\t%c\t\t\t\t\t\t\t      %c\n",25,25);
        printf("\t%c\t\t3. 添加图书( Member management)\t\t      %c\n",25,25);
        printf("\t%c\t\t\t\t\t\t\t      %c\n",25,25);
        printf("\t%c\t\t4. 修改图书( Financial management)\t      %c\n",25,25);
        printf("\t%c\t\t\t\t\t\t\t      %c\n",25,25);
        printf("\t%c\t\t0. 退出系统( EXIT )\t\t\t      %c\n",25,25);
        printf("\t%c\t\t\t\t\t\t\t      %c\n",25,25);
        printf("\t%c\t\t\t\t\t\t\t      %c\n",25,25);
        printf("\t%c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c %c\n",
            26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27);

}

void SearchBook()
{

}

void DeleteBook()
{

}

void AddBook()
{

}

void ReviseBook()
{

}

void InitList(SqList *L)
{
    L->eBook = (Book*)malloc(LEN*MAX);
    if(!L->eBook){
        printf("分配内存失败!\n");
        exit(0);
    }
}



void main()
{
    int n;
    SqList *L;
    InitList(L);

    while(1){

        InitView();
        printf("请选择你需要的功能的编号:");
        scanf("%d",&n);
        getchar();
        switch(n){
            case 1:SearchBook();break;
            case 2:DeleteBook();break;
            case 3:AddBook();break;
            case 4:ReviseBook();break;
            case 0:exit(0);break;
            default :printf("输入有误,请重新输入!\n");system("pause");system("cls");
        }
    }

}

为什么这样分配内存不行呢? 黑框弹出一回儿就说这程序已经停止工作了
其中LEN是sizeof(Book) ,MAX 为100

1、C中内存分为四个区
栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。
堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。
全局区:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。......
答案就在这里:C语言内存分配问题
----------------------你好,人类,我是来自CSDN星球的问答机器人小C,以上是依据我对问题的理解给出的答案,如果解决了你的问题,望采纳。

你全部代码可以贴出来看看,从代码看,你应该用到了next指针,在insert函数中,你采用的是动态连续内存分配,在相关结构体上next指针没有初始化,一旦使用进程会crash

你的指针L没有初始化,L也需要先指向一片内容

L没有初始化吧
记得释放内存

问题出在这里

 SqList *L;
 InitList(L);

L是一个指针,没有初始化,指向了一个人类无法得知的地方。用windows的话说,可能是它的进程空间,也可能是别的进程空间,你就传进去。

 L->eBook = (Book*)malloc(LEN*MAX);

这里你又去访问它。 如果运气好L开始指向的地址在自己的进程空间内,就不会报错,否则系统会必定报错。

修改方法

  SqList L;
  InitList(&L);

还有你malloc得到内存,用完之后记得free。

void InitList(SqList *L)改为SqList * InitList(); 把SqList * L形参放到函数内部就得到你想要的了