这是新手小白发布的第一篇博客,希望记录下这次长达2小时的思考过程。
首先,我同学发了我一道题目,就是要通过scanf输入两个数组的元素数以及数组内的具体元素,然后再放入同一个数组中进行从小到大的排序。
因此我先编写了一个冒泡排序bulbble_sort函数,调试无误;
以下是我第一次写出来的代码:
int main()
{
int m, n, i, j, sz;
m = n = i = j = sz = 0;
int a[] = { 0 };
int b[] = { 0 };
int c[] = { 0 };
printf("请输入第一个数组的数量:>");
scanf_s("%d", &m);
printf("\n");
printf("请输入第二个数组的数量:>");
scanf_s("%d", &n);
printf("\n");
sz = m + n;//计算c数组的元素数量
printf("请依次输入第一个数组的元素:>");
for (i = 0; i < m; i++)
{
scanf_s("%d", &a[i]);//这边输入了多少个数,a数组就有多少个数了
}
printf("\n");
printf("请依次输入第二个数组的元素:>");
for (j = 0; j < n; j++)
{
scanf_s("%d", &b[j]);//同上,b就有n个数了
}
printf("\n");
for (i = 0; i < m; i++)
{
c[i] = a[i];
}
for (j = i; j < m + n; j++)
{
c[j] = b[j - m];//c从第m+1个开始;b从第一个开始,到第n个结束
}
bubble_sort(c, sz);
for (i = 0; i < sz; i++)
{
printf("%d", c[i]);
}
return 0;
}
整体运行时出现了报错:
“Run-Time Check Failure #2 - Stack around the variable ‘a‘ was corrupted.”
思路:错误显示是a数组的栈溢出,我猜测可能是在循环过程中变量过大导致的越界访问,所以我试着调试了以下循环的部分:
for (i = 0; i < m; i++)
{
scanf_s("%d", &a[i]);//这边输入了多少个数,a数组就有多少个数了
}
for (j = 0; j < n; j++)
{
scanf_s("%d", &b[j]);//同上,b就有n个数了
}
for (i = 0; i < m; i++)
{
c[i] = a[i];
}
for (j = i; j < m + n; j++)
{
c[j] = b[j - m];
}
监视变量的时候发现,并没有出现 a[ ] 括号里面的 i 变量大于m-1(输入的a数组元素数),b[ ]括号里的j变量大于n-1的情况,并没有在循环时出现栈溢出;
所以接下来我想:是否在定义数组的时候出了问题?
我查看了定义数组的部分:
int a[] = { 0 };
int b[] = { 0 };
int c[] = { 0 };
并没有指定a,b,c数组的元素数量;
所以我做出更改:
int a[m] = { 0 };
int b[n] = { 0 };
int c[m+n] = { 0 };
结果报错:
查了CSDN,发现有的编译器不能认可含变量的数组!只有C99下许可
所以我作了下更改:
发现跑过了
所以下面只要解决如何创建可变数组就可以了。
可以换个编译器如Dev C++,可以直接写arr[m]的数组(m为变量)。
可以写个实现可变数组的函数,需要用到结构体变量的知识,放在学习了结构体之后讨论。