要求:
给定一个数组, 实现冒泡排序. 要求冒泡排序的函数单独封装.
这个没问题,以下代码可以实现
问题出在后面, 我自己的拓展
#include <iostream>
using namespace std;
void bubbleSort(int arr[], int length) //要排序,肯定需要传数组本身
//要对各种长度的数组都适用,长度也得传进来
{
for (int i = 0; i < length-1; i++)
{
for (int j = 0; j < length - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
for (int k = 0; k < length; k++) //这个for可以注释掉,它只是检查每一轮的冒泡是否符合规则.
{
cout << arr[k] << " " ;
}
cout << endl;
}
for (int l = 0; l < length; l++) //输出排序结果.
{
cout << arr[l] << " ";
}
cout << endl;
}
int main()
{
int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
int length = sizeof(arr) / sizeof(arr[0]); //要对各种长度的数组适应,最好用计算得出长度.
bubbleSort(arr, length);
return 0;
}
我又突发奇想添加了一个用户自己输入数组的功能, 可以通过编译, 可以运行, 可以得到正确结果
但是不知道为什么报错.
Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted
我的想法是使用地址传递, 主函数向函数传入一个数组首地址, 函数中接收用户输入的值.
并且统计数组长度, 然后把这个长度作为返回值返回.
接下来在主函数中通过寻址找回这些值, 然后赋值给数组, 再把数组和长度传给冒泡排序.
调试模式告诉我错误在最后一行, 主函数 int main(){ }的右大括号后面…
搜了一下是内存越界的问题, 但是这个变量a我基本没用过,不知道到底哪儿越界了.
而且都执行完了出结果了才告诉我越界...
属实看不懂. 如果有大佬路过希望您能帮忙解答一下,谢谢.
源代码:
#include <iostream>
using namespace std;
int input(int* p)
{
cout << "请输入数字,用回车分隔,最多1000个,全部输入完后输入-1表示终止输入" << endl;
int length = 0;
for (int i = 0; i < 1001; i++)
{
cin >> *p ;
//cout << *p;
if (*p == -1)
{
cout << "已输入" << length << "个数" << endl;
break;
}
p++;
length++;
}
return (length);
}
void bubbleSort(int arr[], int length) //要排序,肯定需要传数组本身
//要对各种长度的数组都适用,长度也得传进来
{
for (int i = 0; i < length-1; i++)
{
for (int j = 0; j < length - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
for (int k = 0; k < length; k++) //这个for可以注释掉,它只是检查每一轮的冒泡是否符合规则.
{
cout << arr[k] << " " ;
}
cout << endl;
}
cout << "排序结果: ";
for (int l = 0; l < length; l++) //输出排序结果.
{
cout << arr[l] << " ";
}
cout << endl;
}
int main()
{
//int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
//int length = sizeof(arr) / sizeof(arr[0]); //要对各种长度的数组适应,最好用计算得出长度.
int a = 0;
int* p = &a;
int length = input(p);
cout <<"长度为: " << length << endl;
int arr[1001];
cout << "数组为: ";
for (int i = 0; i < 1000; i++)
{
if (*p == -1)
{
break;
}
arr[i] = *p;
cout << arr[i] << " ";
p++;
}
cout << endl;
bubbleSort(arr, length);
return 0;
}
解决方案
仔细想了一下, 我只定义了一个 a 作为数组首地址存放数据.
然后让指针偏移4个字节继续存放数据.
也就是说偏移到的内存 不是由程序分配的……是我自己强行写入的
这样 p++; 之后的指针全是野指针.....
绷不住力
幸好是往后偏移, 数据量也不多, 没出什么大问题.
在主函数中把 p 指向一个分配过足量内存的数组的首地址就好了.
#include <iostream>
using namespace std;
int input(int* p)
{
cout << "请输入数字,用回车分隔,最多1000个,全部输入完后输入-1表示终止输入" << endl;
int length = 0;
for (int i = 0; i < 1001; i++)
{
cin >> *p ;
//cout << *p;
if (*p == -1)
{
cout << "已输入" << length << "个数" << endl;
break;
}
p++;
length++;
}
return (length);
}
void bubbleSort(int arr[], int length) //要排序,肯定需要传数组本身
//要对各种长度的数组都适用,长度也得传进来
{
for (int i = 0; i < length-1; i++)
{
for (int j = 0; j < length - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
for (int k = 0; k < length; k++) //这个for可以注释掉,它只是检查每一轮的冒泡是否符合规则.
{
cout << arr[k] << " " ;
}
cout << endl;
}
cout << "排序结果: ";
for (int l = 0; l < length; l++) //输出排序结果.
{
cout << arr[l] << " ";
}
cout << endl;
}
int main()
{
//int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
//int length = sizeof(arr) / sizeof(arr[0]); //要对各种长度的数组适应,最好用计算得出长度.
int arr[1001];
int* p = arr;
int length = input(p);
cout << "长度为: " << length << endl;
cout << "数组为: ";
for (int i = 0; i < 1000; i++)
{
if (*p == -1)
{
break;
}
arr[i] = *p;
cout << arr[i] << " ";
p++;
}
cout << endl;
bubbleSort(arr, length);
return 0;
}
不再报错.
能实现这个需求还挺有成就感的.
收获:
用函数封装用户输入的内容时, 往往需要地址传递(因为retrun 只能返回一个值).
再去主函数中把这些数据读出来.
但是在调用函数之前一定要先创建一个长度足够的数组, 不要直接往未分配的内存空间写数据.