• 重生之我是一名程序员 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语言中的栈溢出问题了,那今天的知识分享就到此结束啦,感谢大家支持,各位明天见! 

  • 相关阅读:
    Studio One6.5最新版本新增了对Linux的支持
    数组类型和多维数组本质
    开发工程师必备————【Day23】Django基础知识
    TopK问题求解方法
    golang实现打包dll文件到exe
    10月BIOTREE协助发表文章再创新高,最高影响因子31.373
    PostgreSQL 技术内幕(十一)位图扫描
    七夕送什么礼物好?推荐最实用的礼物护眼台灯
    Naive UI数据表格分页pageCount配置没效果
    Python怎么实现动态的方法调用?比如Ruby就有元编程
  • 原文地址:https://blog.csdn.net/StarslxYzxcvbnm/article/details/134539740