段错误产生原因

news2025/2/1 1:00:57

        嵌入式C开发,或多或少都遇到段错误(segmentation fault )。

        下面是一些典型的段错误产生的原因:

  • 访问不存在的内存地址

  • 访问只读的内存地址

  • 栈溢出

  • 内存越界

  • ……

实例

        1. 访问不存在的内存地址

#include <stdio.h>

int main(int argc, char **argv)
{
    printf("==================segmentation fault test==================\n");

    int *p = NULL;
    *p = 1234;

    return 0;
}

      2. 访问只读的内存地址

#include "stdio.h"
#include <stdlib.h>
#include "string.h"
void main()
{
	printf("==================segmentation fault test==================\n");
	char Data[] = "qwertyuiop";
	char *data = NULL;	//即使初始化为空,指针data可能是指向了一个只读的内存:memcpy执行失败,造成空指针解引用(空指针间接引用)
	memcpy (data,Data,sizeof(Data));	//引用空指针
	printf ("data is %s.\nand sizeof(Data) is %d.\n", data, sizeof(Data));
	free(data);
	data = NULL;
}
#include <stdio.h>

int main(int argc, char **argv)
{
    printf("==================segmentation fault test==================\n");

    char *str = "hello";
    str[0] = 'H';

    return 0;
}

         3. 栈溢出  

        程序的有效内存还可以再分为多个区域,每个区域都有不同的作用,比如代码区、全局数据区、堆区、栈区、动态链接库区等。栈就是这些内存分区中的一个。

        那么,栈是用来做什么的呢?整个内存都是用来存储数据的,栈也不例外。栈用来存储程序的局部数据。

        对于C/C++来说,局部数据是指在函数内部定义的数据,例如在函数内部定义的变量、指针、参数、结构体、数组、对象、引用等,它们都要保存到栈中。

        栈为什么会溢出?

        对每个程序来说,栈能使用的内存是有限的,一般是 1M~8M,这在编译时就已经决定了,程序运行期间不能再改变。如果程序使用的栈内存超出最大值,就会发生栈溢出(Stack Overflow)错误,程序就崩溃了。

#include <stdio.h>

static void test(void)
{
    char buf[1024 * 1024] = {0};    //每次递归均会分配存储区
    static int i = 0;
    i++;
    printf("i = %d\n", i);
    test();    //递归
}

int main(int argc, char **argv)
{
    printf("==================segmentation fault test==================\n");

    test();

    return 0;
}

        什么情况下才会发生栈溢出呢?

        最常见的就是递归。每次递归就相当于调用一个函数,函数每次被调用时都会将局部数据(在函数内部定义的变量、参数、数组、对象等)放入栈中。

        递归1000次,就会将1000份这样的数据放入栈中。这些数据占用的内存直到整个递归结束才会被释放,在递归过程中只会累加,不会释放。如果递归次数过多,并且局部数据也多,那么会使用大量的栈内存,很容易就导致栈溢出了。

        4. 内存越界

#include <stdio.h>

int main(int argc, char **argv)
{
    printf("==================segmentation fault test==================\n");

    static char arr[5] = {0, 1, 2, 3, 4};

    printf("arr[10000] = %d\n", arr[10000]);    //访问下标超出了数组长度

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小学生C++编程基础 课程7(A)

897.a到b (课程7&#xff09; 难度&#xff1a;1 登录 898.2位偶数 &#xff08;课程7&#xff09; 难度&#xff1a;1 登录 899.从0开始&#xff08;课程7&#xff09; 登录 900.前面数 &#xff08;课程7&#xff09; 登录 901.奇数 (课程7) 登录 902.7的倍数 (课程7) …

第二证券|新冠药销售占比不到1.5%,三连板医药龙头跌停!

今天早盘&#xff0c;A股商场延续调整态势&#xff0c;沪指震动失守3100点整数关口&#xff0c;深证成指、创业板指跌幅在1%左右。 虽然指数体现不佳&#xff0c;但个股层面不乏亮点。从涨跌份额来看&#xff0c;早盘A股商场有2695只股票上涨&#xff0c;2017只股票跌落&#x…

计算机毕设Python+Vue学生在线请假管理系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

双向扩散模型

🍿*★,*:.☆欢迎您/$:*.★* 🍿 简单的描述是一个图先扩散为噪声而后 噪声扩散为另一个图 这样的思路类似如 当人类看到图之后 开始联想和脑补 不断的脑补 一步一步的 脑补出另一幅图 比如给定图的一部分 脑补出另一部分 与传统的扩散模型 不同的点在于 初始给定的是一个…

2022 UUCTF Web

目录 <1> Web (1) websign(禁用js绕过) (2) ez_rce(?>闭合 rce) (3) ez_unser(引用传递) (4) ez_upload(apache后缀解析漏洞) (5) ezsql(union注入) (6) funmd5(代码审计 %0a绕过preg_replace) (7) phonecode(伪随机数漏洞) (8) ezpop(反序列化字符串逃逸) …

Sharding-JDBC(三)按月分表

目录1.Maven 依赖2.创建表结构3.yml 配置4.TimeShardingAlgorithm.java 分片算法类5.ShardingAlgorithmTool.java 分片工具类6.ShardingTablesLoadRunner.java 初始化缓存类7.SpringUtil.java Spring工具类8.代码测试9.测试结果背景&#xff1a; 项目用户数据库表量太大&#x…

20221220英语学习

今日新词&#xff1a; hurt adj.&#xff08;身体上&#xff09;受伤的, &#xff08;感情上&#xff09;受伤的 blood n.血, 血统, 有…类型的血的, 家世 sister adj.姐妹的, 同类(型)的 humour n.&#xff08; humor&#xff09;幽默, 心情, 情绪, 脾气 holiness n.神圣…

UX设计师是做什么的,现在怎么样

对设计领域略知一点的学生都知道UX设计已经流行了很长一段时间&#xff0c;几年前它的平均工资甚至超过了程序员&#xff0c;那么它的未来会一如既往地保持它的热度吗&#xff1f;未来稳定增长的高薪会下降吗&#xff1f;UX可以称之为科技领域的新秀。根据去年的数据统计&#…

AnQICMS 安装步骤教程

AnQICMS 安装步骤教程 支持的系统 支持 Windows 7、Windows 8、Windows 10、Windows 11、Windows server 各个版本。 Windows XP 未测试 支持 Ubuntu、Centos、Red Hat、Debian 等 基于 X86 的 Linux 版本。 支持 MacOS。 Linux服务器上部署AnQiCMS 先从 https://www.anqic…

力扣(LeetCode)169. 多数元素(C++)

抵消法 多数元素的数量比其他所有元素的总数还多。那么从前往后遍历&#xff0c;遇到相同元素&#xff0c;计数 111 &#xff0c;遇到不同元素&#xff0c;计数 −1-1−1 &#xff0c;考虑边界&#xff0c;当旧数的出现次数减到 000 &#xff0c;那么新数就可以替换旧数&#…

携手华为,瑞金医院病理科为健康数字化保驾护航

作者 | 曾响铃 文 | 响铃说 人生在世&#xff0c;沧桑流转&#xff0c;到了晚年&#xff0c;各种疾病袭来&#xff0c;总是无法避免&#xff0c;总要坦然接受。 只是&#xff0c;这个时候&#xff0c;能够知道自己究竟得的是什么病&#xff0c;才好去积极面对、笑对苦难。 …

前端简单案例——扩展卡

效果展示 色块可以替换成图片&#xff0c;改变background-color为background-image即可。 html代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&quo…

图片加载引入的内存溢出问题分析

Android ImageView进行图片加载时&#xff0c;经常会遇到内存溢出的问题&#xff0c;本文针对于这一问题出现的定义、原理、过程、解决方案做统一总结。 1.一些定义 在分析具体问题之前&#xff0c;我们先了解一些基本概念&#xff0c;这样可以帮助理解后面的原理部分。当然了…

实时通讯技术Ajax,WebSocket,SSE

实时通讯技术是一项基于web开发的重要技术&#xff0c;网站是需要前后端通讯的&#xff0c;因此数据刷新的时间就是获取信息的时间&#xff0c;为了能准确而有快速的获取信息需要尽可能的提高信息的刷新效率。 常见的实时通讯技术&#xff1a; 通讯方式AjaxCometWebSocketSSE…

从0到1学会开发前端脚手架

【课程简介】 在前端开发中经常会用到create-vue, create-react-app这类脚手架&#xff0c;它可以帮助我们快速生成一个配置化的项目&#xff0c;提高开发效率。现在很多大厂都有自己研发的脚手架&#xff0c;掌握脚手架的使用&#xff0c;并且自己能开发脚手架&#xff0c;能…

涵盖全场景构建方方面面!魅族2023-2025年产品矩阵曝光

在万物互联的时代大背景下&#xff0c;一众以智能手机闻名的科技厂商们开始了全场景概念上的推进构建&#xff0c;形如早前作为国产智能手机「领头羊」的老牌手机厂商魅族&#xff0c;就在近日公布了2023-2025年全场景多终端沉浸式的全方位产品矩阵。 从中可以看到&#xff0c…

解读最佳实践:倚天 710 ARM 芯片的 Python+AI 算力优化 | 龙蜥技术

编者按&#xff1a;在刚刚结束的 PyCon China 2022 大会上&#xff0c;龙蜥社区开发者朱宏林分享了主题为《ARM 芯片的 PythonAI 算力优化》的技术演讲。本次演讲&#xff0c;作者将向大家介绍他们在倚天 710 ARM 芯片上开展的 PythonAI 优化工作&#xff0c;以及在 ARM 云平台…

SCI 论文插图格式一般要求

插图是反映 SCI 文章品质的核心指标之一&#xff01;&#xff01;&#xff01; 图片格式要求:图片一般可以保存为TIFF、JPEG、EPS这三种常见格式,并存为独立文件。 二、图片色彩要求:一般要求为CMYK或RGB色彩。 1.尺寸符合杂志社的要求(宽度8.3~17.6厘米,高度一般不超过20厘米…

云服务下半场,企业增长的超级入口在哪?

随着数字技术的加速突破以及相关鼓励政策的出台&#xff0c;云服务市场正在进入爆发性增长阶段。 在市场、政策的双轮驱动下IT架构转型已是大势所向&#xff0c;而作为时代命题&#xff0c;传统厂商们如果还无法让市场看到转型的成果和信心&#xff0c;或将逐渐在市场端失去选…

专访实在智能孙林君:颠覆传统RPA的实在IPA模式,如何做到真正人人可用?

文/王吉伟 “RPA人人可用”这个愿景&#xff0c;在一线大厂提出后立即得到广大厂商的认同与推崇&#xff0c;之后它几乎成了所有厂商的“口头禅”。 如果RPA能够消除使用门槛实现真正人人可用&#xff0c;意味着每个组织都能通过引入RPA快速通过流程自动化快速实现增效降本。…