动态申请数组与赋值运行结果有问题

问题遇到的现象和发生背景

动态申请数组后,无法完成动态传值,编译运行都没问题,就是数据对不上。

img

 printf("%d\n", count); // count=5
int *data = (int *)malloc(sizeof(int) * count);
    // data[0]=5;
    if (data == NULL)
    {
        printf("分配内存失败\n");
        data = (int *)realloc(data, 4 * count);
        printf("data=%d\n", data == NULL);
    }
    printf("分配内存成功%d\n", sizeof(data)); // 输出为结果为4
    int i = 0;
    while (num)
    { // num=99666
        // t==num%10;
        printf("分配内存成功%d\n", i);
        data[(i++)] = num % 10; //
        // printf("%d\n",t);
        printf("%d\n", data[i]); // 每次输出都为0;
        num = num / 10;
    }

我想要达到的结果

用动态数组接收数据;

 data[(i++)] = num % 10; //
        // printf("%d\n",t);
        printf("%d\n", data[i]); // 每次输出都为0

这里你给data[i]赋值但之后i++,所以之后输出的是赋值后的后一个数组元素

data[(i++)]后下标变了,data[i]是下一个还没初始化,i放到循环最后去加1

将i++放到打印语句之后,data[i++]修改为data[i],测试下结果!

data[(i++)] = num % 10; 这句的执行拆解如下:如 i = 0时, data[i = 0] = num % 10; i++; 两句, 执行完 i = 1; 然后执行 printf("%d\n", data[i]); ,此时 data[i = 1] , 所以想显示上一位的数值应改为:printf("%d\n", data[i-1]); ,修改如下,供参考:

int  count = 5;
     printf("%d\n", count); // count=5
     int *data = (int *)malloc(sizeof(int) * count);
     // data[0]=5;
     if (data == NULL)
     {
         printf("分配内存失败\n");
         data = (int *)realloc(data, 4 * count);
         printf("data=%d\n", data == NULL);
     }
     printf("分配内存成功%d\n", sizeof(data)); // 输出为结果为4
     int i = 0, num = 12345;
     while (num)
     {
        // t==num%10;
        printf("分配内存成功%d\n", i);
        data[(i++)] = num % 10;
        // printf("%d\n",t);       //上一句执行完,i++ , i 自增 1 了,
        printf("%d\n", data[i-1]); //所以这句改为 i-1, printf("%d\n", data[i]);  修改
        num = num / 10;
     }

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7604322
  • 这篇博客你也可以参考下:文件的输入输出:从键盘读入若干个字符串,对它们按字母大小的顺序排序,然后把排好序的字符串送到磁盘文件保存
  • 除此之外, 这篇博客: 【程序员的自我修养】[动态图文] 超详解函数栈帧中的 函数被调用时的传参 及 被调用函数栈帧的创建 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    调用需要使用参数的函数时,需要传入存在的局部变量,作为函数的参数。
    但是,被传入函数的参数,在函数中都被称为 形参,在被调用函数中 直接改变 并不能真正改变原来的变量,这是为什么?

    真正的原因,就在这里:



    先分析汇编代码:

    mov        eax,dword ptr [ebp-14h]
    push       eax
    mov        ecx,dword ptr [ebp-8]
    push       ecx
    

    ebp-14h 地址处的双字的值(即变量 b 的值)存入 寄存器 eax,压栈存入 eax ,压入位置是:0x00AFF894
    ebp-8 地址处的双字的值(即变量 a 的值)存入 寄存器 ecx,压栈存入 ecx,压入位置是:0x00AFF890

    执行之后内存中的变化:
    形参的传参

    这两个步骤,其实就是形参的创建,或者说调用函数时的传参操作
    (被调用函数究竟是如何使用形参的内容在下边)
    也就是说,形参的创建其实是在 main 函数的栈帧中创建的。

    汇编指令继续向下执行(注意:执行 call 指令时,(VS环境)F11 进入函数内部 ):

    call 指令,在这里的作用是:

    1. call 指令的一下条指令的地址(00911F00)压入栈中
    2. 然后跳转至 后边的地址(009111E0)的代码处

    Call 指令执行
    到此时内存变化:

    Virtual_variables_creat

    jmp 指令:无条件跳转至 后边的地址处
    即在此指令中,跳转至00911A40

    执行 jmp
    jmp Add

    执行 jmp 之后,进入 Add 函数,会发现一段熟悉的指令,和进入 main 函数时的前几行指令相似。
    这段指令就是 Add 函数预开辟栈帧的指令(不再分析),直接看图:

    1. 先压栈,压入的是 维护 main 函数栈帧时的ebp
      Add函数压入维护main的ebp

    2. 连续执行指令,预创建及处理 Add 函数栈帧:
      Add_函数栈帧创建

    Add_SF_Creat

    以上是 Add 函数栈帧的创建过程。

  • 您还可以看一下 刘建萍老师的人工智能系列课程零基础讲解知识点和实例应用线性回归梯度下降逻辑回归课程中的 讲解机器学中会涉及到的有关数学方面的知识储备有哪些小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    针对出现数据对不上的问题,可以从以下几个方面进行检查和解决:

    1.检查动态申请数组的大小是否正确。

    2.检查数组的下标是否有误。可以添加打印数组中每个元素的代码,检查是否正确获取和赋值了每个元素。

    3.检查是否正确将数据存入动态数组。可以添加打印存入数据的代码,检查是否存入了正确的数据。

    4.若以上都排除了问题,可以考虑使用调试器进行调试,查看具体的变量值和执行过程,找到问题的所在。

    具体的解决方法会根据实际情况而定,可以参考以上方面进行排除和解决。同时,也需要注意在动态申请数组时,要及时释放内存避免内存泄漏。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^