c语言程序设计问题_c语言问题,程序执行后为什么空间每增加?
#include <stdio.h>
#include <stdlib.h>
#define LIST_INIT_SIZE 300 //线性表存储空间的初始分配量
#define LISTINCRESEMENT 100 //线性表存储空间的分配增量
#define OK 1
#define ERROR 0
#define OVERFLOW 0
typedef int elemType;//元素类型
typedef struct
{
elemType *List;//线性表首地址
int length;//当前的长度
int listsize;//当前分配的存储容量,以elemType为单位
} SqList;
void AgainMalloc(SqList *L)//空间不够时重新分配空间的函数
{
elemType *newbase;//分配一个临时基址
newbase=(elemType *)realloc(L->List,(L->listsize+LISTINCRESEMENT)*sizeof(elemType));
if(!newbase) exit(OVERFLOW);
L->List=newbase;
L->listsize+=LISTINCRESEMENT;
}
//初始化一个空的线性表
int InitList_Sq(SqList *L)
{
L->List=(elemType *)malloc(LIST_INIT_SIZE*sizeof(elemType));
//malloc分配一定的内存空间,然后把这段内存空间的地址赋值给L.elem
//如果malloc分配成功,L->List指向分配的空间,如果分配失败(比如内存不够)
//malloc会返回0,L->List的值就被赋0
if(!L->List)
exit(OVERFLOW);//overflow exit是退出程序的函数
L->length=0;//初始表为空表
L->listsize=LIST_INIT_SIZE;//初始表的存储容量,为LIST_INIT_SIZE个elemType单位
return OK;
}
int main()
{
SqList *list1;
InitList_Sq(list1);
printf("%p\n",list1);
AgainMalloc(list1);
printf("%p\n",list1);
}
最佳答案
你的头指针没有初始化,在你的
int InitList_Sq(SqList *L)
中,你的L是个野指针(你没有给它值,它是随机的)
而你的
L->List=(elemType *)malloc(LIST_INIT_SIZE*sizeof(elemType));
因为L是没有分配地址所以内存出错了
追问:
大佬能帮忙修改一下吗? 追答:
最简单的改 SqList *list1; 为 SqList *list1=(SqList *)malloc(sizeof(SqList)); 就可以了
追问:
增加空间后首地址还是一样的,对吧,怎么查看空间大小的变化?
追问:
int a=sizeof(list1); printf("%d\n",a);用这段代码可以吗?
这个当然不可以,你的a只是变量list本身的大小,且它是静态的,32位下它就是4C语言的内存管理是通过系统的接口来完成的,所以,它本身没有函数来查看一个指针所能空间大小(这个只是在编程时由编程者控制),也没有标准函数来查看系统的内存变化(不同系统的内存管理是不同的),你一定要了解内存的状态,就要直接用系统的API或其系统调用,且这个一般都是操作系统厂家内部的函数,有的甚至是不公开的
其他回答
其它网友回答:
malloc分配的内存空间,用完要用free函数释放
其它网友回答:
记得要释放内存
其它网友回答:
使用完要释放内存
其它网友回答:
不是所有程序执行后都能增加空间的
其它网友回答:
程序结束后未释放的内存会由系统回收
但是这不是个好习惯,作为合格的C程序员,内存的分配和释放应在程序中体现,避免出现内存溢出的问题
追问:
我这是因为被系统回收了?
其它网友回答:
因为使用完内存之后没有释放内存的