【C语言】指针基础知识(三)

一,野指针

定义:野指针就是指针指向的位置是不可知的

1,野指针成因

a,指针未初始化

局部变量指针未初始化,默认为随机值 
局部变量指针未初始化,默认为随机值 
 

b,指针越界访问

#include <stdio.h>
int main()
{
	int arr[10] = { 0 };
	int* p = &arr[0];
	int i = 0;
	for (i = 0; i <= 11; i++)
	{
		//当指针指向的范围超出数组arr的范围时,p就是野指针
		*(p++) = i;
	}
	return 0;
}

c,指针指向的空间释放

#include <stdio.h>
int* test()
{
    int n = 100;
    return &n;
}
int main()
{
    int* p = test();
    printf("%d\n", *p);
    return 0;
}

申请了空间可以用,出了这个空间就还给操作系统了,还给操作系统后就没有使用权限了。

如何不销毁?static int n = 100; //这样定义n就可以了。

2,如何规避野指针

a,指针初始化

 

如果不知道指针应该指向哪⾥,可以给指针赋值NULL. NULL 是C语⾔中定义的⼀个标识符常量,值是0,0也是地址,这个地址是⽆法使⽤的,读写该地址会报错。

b,小心指针越界

⼀个程序向内存申请了哪些空间,通过指针也就只能访问哪些空间,不能超出范围访问

c,指针变量不再使用时,及时置NULL,指针使⽤之前检查有效性

当指针变量指向⼀块区域的时候,我们可以通过指针访问该区域,后期不再使⽤这个指针访问空间的时候,我们可以把该指针置为NULL

d,避免返回局部变量的地址

二,assert断言

1,assert的头文件为assert.h ,⽤于在运⾏时确保程序符合指定条件,如果不符合,就报
错终⽌运⾏。这个宏常常被称为“断⾔”。
 
2,如果已经确认程序没有问题,不需要再做断⾔,就在 #include <assert.h> 语句的前⾯,定义⼀个宏 NDEBUG 。然后,重新编译程序,编译器就会禁⽤⽂件中所有的 assert() 语句。

 

注:assert() 的缺点是引入了额外的检查,增加了程序的运行时间。

⼀般我们可以在 Debug 中使⽤,在 Release 版本中,直接就是优化掉了。这样在debug版本写有利于程序员排查问题, 在 Release 版本不影响⽤户使⽤时程序的效率。
#define NDEBUG
#include <assert.h>

三,传值调用和传址调用

传址调⽤,可以让函数和主调函数之间建立真正的联系,在函数内部可以修改主调函数中的变量;所以未来函数中只是需要主调函数中的变量值来实现计算,就可以采⽤传值调⽤。如果函数内部要修改主调函数中的变量的值,就需要传址调。

总结:传值调用--修改变量的值

           传址调用--修改主调函数中的变量

 

传值调用:

#include <stdio.h>
void Swap1(int x, int y)
{
 int tmp = x;
 x = y;
 y = tmp;
}
int main()
{
 int a = 0;
 int b = 0;
 scanf("%d %d", &a, &b);
 printf("交换前:a=%d b=%d\n", a, b);
 Swap1(a, b);
 printf("交换后:a=%d b=%d\n", a, b);
 return 0;
}

传址调用:

#include <stdio.h>
void Swap2(int*px, int*py)
{
 int tmp = 0;
 tmp = *px;
 *px = *py;
 *py = tmp;
}
int main()
{
 int a = 0;
 int b = 0;
 scanf("%d %d", &a, &b);
 printf("交换前:a=%d b=%d\n", a, b);
 Swap1(&a, &b);
 printf("交换后:a=%d b=%d\n", a, b);
 return 0;
}

 

 

 

 

 

 

 

相关推荐

  1. C语言指针基础知识

    2024-03-26 20:06:01       39 阅读
  2. c语言指针基础知识

    2024-03-26 20:06:01       60 阅读
  3. C语言指针基础题()

    2024-03-26 20:06:01       76 阅读
  4. C语言指针基础

    2024-03-26 20:06:01       45 阅读
  5. c语言基础知识

    2024-03-26 20:06:01       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-26 20:06:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-26 20:06:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-26 20:06:01       82 阅读
  4. Python语言-面向对象

    2024-03-26 20:06:01       91 阅读

热门阅读

  1. gcc和gdb

    2024-03-26 20:06:01       33 阅读
  2. MongoDB聚合运算符:$indexOfBytes

    2024-03-26 20:06:01       42 阅读
  3. Linux实战笔记(五) shell

    2024-03-26 20:06:01       36 阅读
  4. 【C++】缺省参数

    2024-03-26 20:06:01       39 阅读
  5. AI大模型学习

    2024-03-26 20:06:01       38 阅读
  6. 【NC16622】多项式输出

    2024-03-26 20:06:01       40 阅读
  7. Flask 继学习 之 py与js文件的关系和通信

    2024-03-26 20:06:01       41 阅读
  8. 鸿蒙开发(第三部分)二

    2024-03-26 20:06:01       32 阅读
  9. 短剧小程序系统开发搭建短剧付费系统

    2024-03-26 20:06:01       39 阅读
  10. 为wordpress特定分类目录下的内容添加自定义字段

    2024-03-26 20:06:01       39 阅读