• 重生之我是一名程序员 37


    哈喽啊大家晚上好!

    今天呢给大家带来一个烧脑的知识——C语言中的栈溢出问题。那什么是栈溢出呢?栈溢出指的是当程序在执行函数调用时,为了保护函数的局部变量和返回地址,将这些数据存储在栈中。如果函数在函数调用时使用了过多的栈空间(比如递归调用函数时),栈空间可能会被耗尽,从而导致数据溢出到相邻的内存区域。

    下面我给大家举一个例子方便大家更直观的认识栈溢出,比如:

    在VS2022、X86、Debug 的环境下,编译器不做任何优化的话,下⾯代码执⾏的结果是啥?

    1. #include
    2. int main()
    3. {
    4. int i = 0;
    5. int arr[10] = {0};
    6. for(i=0; i<=12; i++)
    7. {
    8. arr[i] = 0;
    9. printf("hehe\n");
    10. }
    11. return 0;
    12. }

    相信大多数人肯定会认为结果是打印出 10个"hehe",但是结果并不止这样,而是程序死循环了

    那为何为这样呢?这就要牵扯到C语言中数据的存放问题了,下面我给大家放一张图相信大家就理解了 

    在这张图中, 栈区内存的使⽤习惯是从⾼地址向 低地址使⽤的,所以变量i的地址是 较⼤的。arr数组的地址整体是⼩ 于i的地址。

     数组在内存中的存放是:随着下标 的增⻓,地址是由低到⾼变化的。 所以根据代码,就能理解为什么是左 边的代码布局了。 如果是左边的内存布局,那随着数组 下标的增⻓,往后越界就有可能覆盖 到i,这样就可能造成死循环的。

    这⾥肯定有人有疑问:为什么i和arr 数组之间恰好空出来2个整型的空间 呢?这⾥确实是巧合,在不同的编译 器下可能中间的空出的空间⼤⼩是不 ⼀样的,代码中这些变量内存的分配 和地址分配是编译器指定的,所以的 不同的编译器之间就有差异了。所以 这个题⽬是和环境相关的。

    那么到这里相信大家就理解了C语言中的栈溢出问题了,那今天的知识分享就到此结束啦,感谢大家支持,各位明天见! 

  • 相关阅读:
    卷积神经网络研究综述 学习记录
    AppGallery Connect场景化开发实战—图片存储分享
    python软件安装技巧
    推荐云盘哪个好,各有各的优势
    Unity 向量计算、欧拉角与四元数转换、输出文本、告警、错误、修改时间、定时器、路径、
    套接字、信号、管道、消息队列、信号量、共享内存的使用场景
    jira获取issue条目transitions id,以用来进行流转实用脚本
    Java调用OpenDDS(3)-自己编写调用OpenDDS的程序
    vue(11)
    python打印字符串中的大写字符
  • 原文地址:https://blog.csdn.net/StarslxYzxcvbnm/article/details/134539740