指针
一.野指针
含义:访问数组越界所导致的,
造成野指针的可能性
1.指针未初始化
int main()
{
int* p;
*p = 20;
int n = 20;
int* p2 = &n;
*p2 = 50;
return 0;
}
2.指针越界访问
int main()
{
int arr[10] = { 0 };
int* p = &arr[0];
int i = 0;
for (i=0 ; i<= 11;i++)
{
*(p++) = i;
}
return 0;
}
3.指针指向的空间被释放
int* Test()
{
int n = 100;
return &n;
}
int main()
{
int*p= Test();
printf("%d\n",*p);
return 0;
}
- 赋为空指针
int main()
{
int a = 10;
int* p = &a;
int* ptr = NULL;
*ptr = 100;
return 0;
}
6.返回栈空间地址的问题(局部变量都放在栈上)
int* test()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
return arr;//局部变量,出作用域销毁
}
int main()
{
int* p = test();
//p就是野指针
return 0;
}
二.如何预防野指针
这里可以利用assert断言防止野指针出现,如要使用assert就需要引用头文件**#include <assert.h>**,具体可以查询链接: [link](链接: link)
例如
int main()
{
int a = 10;
int* p = NULL;
assert(p);
return 0;
}
这里的运行结果就是图片:
这里可以使用#define NDEBUG来禁止assert断言
这里代码就不会报错
冒泡排序
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
void sort(int* arr, int sz)
{
//确定冒泡排序的趟数
int i = 0;
for (int i = 0; i < sz - 1; i++)
{
//一趟冒泡拍序
int flag = 1;//假设数组是有序的
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;//不是有序的·
}
}
if (flag == 1)
{
break;
}
}
}
void print(int* arr, int sz)
{
int i = 0;
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
int sz = sizeof(arr) / sizeof(arr[0]);
sort(arr, sz);
print(arr, sz);
return 0;
}
这里是运行结果