[已解决]C++ 数组函数指针传递 综合案例 封装冒泡排序

要求:

给定一个数组, 实现冒泡排序. 要求冒泡排序的函数单独封装.

这个没问题,以下代码可以实现

问题出在后面, 我自己的拓展

#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 只能返回一个值).

再去主函数中把这些数据读出来.

但是在调用函数之前一定要先创建一个长度足够的数组, 不要直接往未分配的内存空间写数据.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值