指针和固定大小缓冲区只能在不安全的上下文中使用_作为初学者,在C语言中你应该绝对避免的两个错误...

在C中,最多有2个常见内存错误:

1.悬空指针:

您释放/使得一块内存无效,但没有将指针设置为NULL以便以后进行验证。

2.缓冲区溢出:

您写入和/或读取的数据超出了缓冲区限制。

有很多策略可以避免这两种内存错误。我将首先解决悬空指针:

586763f3b306ad232203f65dce71890f.png

a是一个悬空指针,它指向有效内存,并且该有效内存已释放。下一步是什么?好吧,您将这个东西设置为NULL以便以后可以对其进行NULL检查,并防止意外读取和写入无效内存。

e7bea2293ff38ec5e0eb47669ed7039f.png

悬空的指针并不是那么难处理,只要使用完它的内存,就再次将其设置为NULL即可。但是,另一个危险是如果您复制了原始指针的地址,并且在释放原始指针时不小心使用了该副本!那么您所想的剧情就会发生转折了!!

0f58bf2c24523b58121e3dda2d17798c.png

像这样就出现了:a不再悬空,而b停止!!!

那么您如何避免这种情况?最好的策略是使用指向原始指针的指针:

b5ed79f66864f2d272a7816f93f433e0.png

像这样就是a不是悬空的, b也不会悬空。

现在,处理缓冲区溢出已经很容易了,使用静态大小的缓冲区,编译器可以通过使用已知大小的缓冲区来帮助防止缓冲区溢出。

557f3ab0fef3cac5d96d5eaa4ed86023.png

不管缓冲区的静态大小是多少,用第一个地址减去缓冲区的上限都可以!一个类似的替代方法是直接使用数组的指针作为迭代器:

8229775ac084f0b208a3c0274d715301.png

请记住,这只能防止在静态大小的缓冲区上发生缓冲区溢出,仍然可能存在在动态大小的缓冲区上发生溢出的问题!

在防止动态大小的缓冲区溢出方面。您必须使用簿记变量来跟踪缓冲区的长度,并确保缓冲区的长度跟踪变量不会损坏:

69fb1c7f001b40fd8c22eeba9c098471.png

了解更多有关C/C++学习内容,免费领取学习资料,请看下方了解更多:

b92bbda7dd6c51c3233ddb389cbbfb61.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 语言编写程序时,需要注意哪些问题? 在使用C语言编写程序时,需要注意以下几个问题: 1. 语法规范:C语言有自己的语法规范,需要按照规范编写代码,否则会出现编译错误。 2. 变量命名:变量命名需要具有一定的意义,方便代码的阅读和维护。 3. 内存管理:C语言需要手动管理内存,需要注意内存的分配和释放,避免内存泄漏和野指针等问题。 4. 安全性:C语言容易出现缓冲区溢出等安全问题,需要注意代码的安全性。 5. 代码风格:编写代码时需要注意代码风格的统一性,方便团队协作和代码维护。 ### 回答2: C语言是一种通用的高级编程语言,最初由美国计算机科学家丹尼斯·里奇在20世纪70年代初期于贝尔实验室开发。它是一种基于过程的编程语言,被广泛用于系统软件开发,尤其是操作系统和嵌入式系统的开发。 C语言的特点之一是它的简洁性和灵活性。它提供了一些基本的数据类型和操作符,并支持函数的定义和调用,允许程序员按照自己的需求进行编程。C语言的语法相对简单,易于学习和理解,同时也具有高效的执行速度和占用较少的内存空间。 C语言的另一个重要特点是它的移植性。由于C语言编写的程序可以直接转化为机器语言执行,因此可以在不同的计算机平台上运行。这使得C语言成为了开发跨平台软件的首选语言。许多操作系统和编译器都是用C语言编写的。 C语言还有丰富的标准库和第三方库支持,这些库提供了许多常用的函数和数据结构,方便程序员进行开发。同时,C语言也支持指针操作,使得程序员可以直接访问内存,对数据进行更加灵活和高效的处理。 总结来说,C语言是一种功能强大且广泛应用的编程语言。它的简洁性、灵活性和移植性使得它成为了许多领域的首选语言,特别是在系统软件和嵌入式系统的开发。同时,它也具有丰富的库支持和指针操作等特性,为程序员提供了更多的开发可能性。无论是初学者还是专业程序员,学习和掌握C语言都是非常有价值的。 ### 回答3: C语言是一种通用的高级程序设计语言,它由美国计算机科学家丹尼斯·里奇在20世纪70年代初开发。C语言具有许多优点,因此在软件开发领域广泛应用。 首先,C语言简单易学,语法结构清晰,易于理解和编写。它的语法规则简洁明了,没有过多的特殊符号和复杂的概念,使得初学者能够快速入门,并能够从基本的打印输出、变量声明、条件语句等开始编写简单的程序。 其次,C语言具有高效性。它可以直接访问计算机的底层硬件,能够更好地利用计算机的资源和性能。C语言提供了丰富的内置函数和库,可以进行底层操作,如内存管理、指针运算等,使程序的执行效率更高,特别适用于对性能要求较高的软件开发。 此外,C语言具有良好的可移植性。由于C语言是非常通用的语言,可以在不同的操作系统和硬件平台上编写和运行。只需稍作修改,就能够适应不同环境的需求,因此C语言编写的程序可以在多个平台上运行,提高了软件的可移植性和跨平台兼容性。 最后,C语言还具有广泛的应用领域。几乎所有的操作系统、嵌入式系统和大型应用软件使用C语言开发。例如,UNIX操作系统、Linux操作系统以及许多常用的开源软件,如MySQL、Mozilla Firefox等都是用C语言编写的。C语言在编程领域拥有庞大的生态系统和强大的支持,为开发人员提供了丰富的资源和工具。 总而言之,C语言简单、高效、可移植且广泛应用。掌握C语言可以帮助我们更好地理解和编写程序,为我们在软件开发领域取得成功提供了强有力的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值