动态申请数组后,无法完成动态传值,编译运行都没问题,就是数据对不上。
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;
}
不知道你这个问题是否已经解决, 如果还没有解决的话:调用需要使用参数的函数时,需要传入存在的局部变量,作为函数的参数。
但是,被传入函数的参数,在函数中都被称为 形参
,在被调用函数中 直接改变 并不能真正改变原来的变量,这是为什么?
真正的原因,就在这里:
先分析汇编代码:
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
指令,在这里的作用是:
- 将
call
指令的一下条指令的地址(00911F00)
压入栈中- 然后跳转至 后边的地址
(009111E0)
的代码处
到此时内存变化:
jmp
指令:无条件跳转至 后边的地址处
即在此指令中,跳转至00911A40
处
执行 jmp
:
执行 jmp
之后,进入 Add 函数
,会发现一段熟悉的指令,和进入 main
函数时的前几行指令相似。
这段指令就是 Add
函数预开辟栈帧的指令(不再分析),直接看图:
先压栈,压入的是 维护 main
函数栈帧时的ebp
:
连续执行指令,预创建及处理 Add
函数栈帧:
以上是 Add
函数栈帧的创建过程。
针对出现数据对不上的问题,可以从以下几个方面进行检查和解决:
1.检查动态申请数组的大小是否正确。
2.检查数组的下标是否有误。可以添加打印数组中每个元素的代码,检查是否正确获取和赋值了每个元素。
3.检查是否正确将数据存入动态数组。可以添加打印存入数据的代码,检查是否存入了正确的数据。
4.若以上都排除了问题,可以考虑使用调试器进行调试,查看具体的变量值和执行过程,找到问题的所在。
具体的解决方法会根据实际情况而定,可以参考以上方面进行排除和解决。同时,也需要注意在动态申请数组时,要及时释放内存避免内存泄漏。