ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

C语言实现静态数据表,遇到结构体赋值完成后遍历输出结构体乱码

2021-10-05 22:06:59  阅读:179  来源: 互联网

标签:静态数据 MAX dst ele 乱码 length arrs C语言 SIZE


初学数据结构,在用C实现静态线性表时,遇到奇怪的事情。自己赋值结构体数据后发现数据莫名其妙自己改变了。仔细检查下代码才发现是变量超出函数作用域会被系统自动回收。

问题代码如下:

#include <stdio.h>
#include <windows.h>
#include <string.h>
#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("%p\n", 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<a.length;i++){
        printf("顺序表第%d个元素:ID: %d \t类型: %d\t商品名称: %s\t商品价格: %f\t商品描述: %s\t\n",i+1,a.ele[i].goodsId,a.ele[i].goodsType,a.ele[i].goodsName,a.ele[i].goodsPrice,a.ele[i].goodsDes);
    }
}
//打印输出元素
void printElem(MyDefElement a){
    printf("打印元素(%p):\n\tID: %d \t类型: %d\t商品名称: %s\t商品价格: %f\t商品描述: %s\t\n",&a,a.goodsId,a.goodsType,a.goodsName,a.goodsPrice,a.goodsDes);

}
int main()
{   
    MyDefArrayList mdal;
    InitArrayList(mdal);
    MyDefElement mde = {123142342, RIYONG, "香蕉", 23.92, "可口又美味3!"};
    MyDefElement mde1 = {123142343, RIYONG, "苹果", 12.92, "可口又美味2!"};
    MyDefElement mde2 = {123142344, RIYONG, "梨", 6.92, "可口又美味1!"};
    InsertElem(mdal,mde);
    InsertElem(mdal,mde1);
    InsertElem(mdal,mde2);
    //遍历输出顺序表
    printArrayList(mdal);
    system("pause");
}

起初 当固定大小 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]  应该作为全局变量。

移到外部定义即可。

 

 

 

 

标签:静态数据,MAX,dst,ele,乱码,length,arrs,C语言,SIZE
来源: https://blog.csdn.net/qq_31261871/article/details/120618698

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有