
初学数据结构,在用C实现静态线性表时,遇到奇怪的事情。自己赋值结构体数据后发现数据莫名其妙自己改变了。仔细检查下代码才发现是变量超出函数作用域会被系统自动回收。
问题代码如下:
#include#include #include #define MAX_SIZE 10 enum GoodsTypes { RIYONG, SHUCAI, SHUIGUO } goodsTypes; //自定义数据结构MyDefElement typedef struct { int goodsId; GoodsTypes goodsType; char goodsName[50]; double goodsPrice; char goodsDes[100]; } MyDefElement; //自定义顺序表 存储元素为自定义MyDefElement typedef struct { MyDefElement * ele; int length; } MyDefArrayList; void printElem(MyDefElement aa);//需要先声明函数其他函数调用才能识别到 void printArrayList(MyDefArrayList a); //初始化顺序表 int InitArrayList(MyDefArrayList &a) { MyDefElement arrs[MAX_SIZE]; //返回0表示成功无异常,返回1表示初始化失败 a.ele = arrs; for (int i = 0; i < MAX_SIZE; i++) { arrs[i].goodsId = 0; strcpy(arrs[i].goodsDes,""); strcpy(arrs[i].goodsName,""); arrs[i].goodsPrice = 0; arrs[i].goodsType = RIYONG; } for (int i = 0; i < MAX_SIZE; i++) { printElem(arrs[i]); } printf("%pn", arrs); if (!a.ele) exit(1); a.length = 0; return 0; } //将元素src 插入到dst顺序表中最后一个元素的位置(尾插法) 成功返回1 失败返回0 void InsertElem(MyDefArrayList &dst,MyDefElement &srt){ if (dst.length==MAX_SIZE || !&srt || !&dst) { printf("插入失败!n"); return ; } //拷贝内存 printElem(srt); dst.ele[dst.length].goodsId = srt.goodsId; dst.ele[dst.length].goodsType = srt.goodsType; strcpy(dst.ele[dst.length].goodsName,srt.goodsName); dst.ele[dst.length].goodsPrice = srt.goodsPrice; strcpy(dst.ele[dst.length].goodsDes,srt.goodsDes); //顺序表长度加1 dst.length++; // printArrayList(dst); printf("插入成功!n"); return ; } //打印输出顺序表 void printArrayList(MyDefArrayList a){ for (int i = 0;i
起初 当固定大小 MAX_SIZE 比较大(刚开始写时候数字设置的比较大),输出是正常的。
比如下面是MAX_SIZE 100
当空间比较小是 如 MAX_SIZE 3 时(这里测试只插入了3个元素,理论上是可以插入进去):
但是输出与预想的不符,于是我一步步DEBUG,于是看到当正要跳出void InsertElem(MyDefArrayList &dst,MyDefElement &srt) 函数的时候,dst.ele[0]中的值会自动把变化,首先我想到了是不是跳出了作用域,原定地址内存被系统回收,仔细检查确实如此。
(进入函数与将跳出函数内存数据前后DEBUG对比如下图)
发现int InitArrayList(MyDefArrayList &a) 函数中有问题,
MyDefElement arrs[MAX_SIZE] 应该作为全局变量。
移到外部定义即可。