【C语言】指针的安全

举报
謓泽 发表于 2023/09/30 16:34:46 2023/09/30
【摘要】 【C语言】指针的安全

💥指针的安全 

指针的安全问题很重要也就是在程序中如何使用,如果你能避免指针的危险性那么你指针就肯定学的还是不错的。指针固然是很好用的,但好用的同时又避免不了指针自身实际上是很危险的一个东西,所以我们在使用指针的操作一定要考虑指针的安全性避免程序挂掉或者造成崩溃。

我认为对指针的安全常见问题存在这③个问题

①:野指针

②:空指针

③:字节(地址)的改变

以上这三种都是我认为我们会常见的一些问题所在,在博客当中我也都写到过。所以当我们在使用指针的时候应该思考下我所定义的这个指针是不是一个安全性高的指针。

再举出一些例子供大家参考。示例代码如下 👇

#include <stdio.h>

int main(void)
{
    char str='c';
	int *ptr=(int *)&str;
	*ptr=10086;
	printf("%d\n",ptr);
    return 0;
}

解析代码如下👇:

①:指针 ptr 是一个 int * 类型的指针,它指向的类型是 int 。它指向的地址就是 str 的首地址,在32位系统为4字节,64位为8字节。

②:改变了 str 所占的一个字节,还把和 str 相临的高地址方向的三个字节也改变了。这三个字节是干什么的?只有编译程序知道,而写程序的人是不太可能知道的。也许这三个字节里存储了非常重要的数据,也许这三个字节里正好是程序的一条代码,而由于你对指针的马虎应用,这三个字节的值被改变了!这会造成崩溃性的错误。(关键点在于强制改变char的类型导致取出的字节数发生改变,而这个是我们并不清楚的)

那么相信你对这个能完全掌握的话,对指针的理解会更上一层楼。 那么再举出一个例子供大家去理解:示例代码如下 👇

#include <stdio.h>

int main(void)
{
	char a;
	int *ptr = &a;
	ptr++;
	*ptr = 10086;
	printf("%d\n", *ptr);
	return 0;
}

解析代码如下👇:

这段代码实际上是可以运行成功的,但是它的漏洞实际上很多。就比如很明显的一点:

从char* 到 int* 实际上类型并不兼合。

ptr 对指针 ptr 进行自加1 运算后,ptr 指向了和整形变量a 相邻的高地址方向的一块存储区。这块存储区里是什么?这可出现了巨大的bug,如果一个项目这样的话,很有可能就会丢失一块重要的数据。

而*ptr = 10086,这里就更加离谱了,所以这个指针就近指向了哪里?

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。