#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形参放到函数内部就得到你想要的了