egmentation fault C语言

如何轻松搞定 Segmentation fault ,看这篇就够了! 我相信每个程序员年轻的时候,在运行某程序,当屏幕弹出“Segmentation fault”时,你会变得非常焦虑,因为你不知道代码哪里跑挂了,初级程序员常常使用printf函数在怀疑点一个个的加打印去定位问题出在哪里了。 如果你熟悉gdb,你可能会使用gdb去运行这个程序,然后异常后执行backtrace(简写bt)命令打印异常调用栈。 但是gdb并不是万能的,例如程序运行一段... 阅读详情

看如下程序:

#include<stdio.h>
#include<string.h>
void swap(char *x, char *y){
    char temp = *x; 
    *x = *y; 
    *y = temp;
}
 
 
void main(){
    char *str = "apple";  // 这里当修改字符内容时3会有问题
    swap(str, str+4);
} 


昨天遇到了如上的问题,经过看别人的回答和查阅书籍才明白,如下:

注意: 对于 char *str = "apple" “apple” 存储在 **静态存储器(static memory)**是不可以被修改的,指针指向了该字符串首字符的地址,静态存储区的内容是不允许修改的。对于使用数组初始化:char str[] = "apple" ,在程序运行时把静态存储区的字符串赋值给数组,而数组元素是可以修改的。

  • 当时我把主要精力放在调试temp函数里,认为是temp函数出现问题,实际上则不然。
  • 赋值的时候出现了问题,我就应该考虑是不是不可以赋值去修改字符串里的内容
  • 这时候在考虑 字符串 存放到了哪里,可以修改吗?

因此这个程序只需要把 char *str = "apple" 修改为 char str[] = "apple" 即可。如下:

#include<stdio.h>
#include<string.h>
void swap(char *x, char *y){
    char temp = *x; 
    *x = *y; 
    *y = temp;
}
 
 
void main(){
//    char *str = "apple";  // 这里当修改字符内容时3会有问题
	char str[] = "apple";
    swap(str, str+4);
    puts(str);
} 

对于昨天的刷题文章里出现的问题就可以解决了,程序如下:
字符串反转:

#include<stdio.h>
#include<string.h>
void swap(char *x, char *y){
	char temp = *x; 
	*x = *y; 
	*y = temp;
}

void reverseString(char	*s, int sSize){
	int left = 0;
	int right = sSize-1;
	while(left < right){
		swap(s+left, s+right);
		left++;
		right--;
	}
}

void main(){
	char str[] = "apple";  //这个语句修改一下就可以了 
	int len = strlen(str);
	reverseString(str, len);
	printf("%s\n", str);
} 



今天又解决了一个问题,记录一下,哈哈哈。printf()

C语言指针与内存管理的深入探索 本篇博客深入探讨了C语言中指针的类型转换、指针算术以及内存地址的处理。通过实际代码示例,揭示了指针类型不匹配时编译器警告的含义、如何通过类型转换避免不兼容的指针类型问题,并介绍了void指针和命令行参数的使用。文章还探讨了通过指针操作导致的内存访问违规和segmentation fault错误。 阅读详情

相关推荐

abaqus 6.13安装(ubuntu 16.04LTS)

1。从iso将文件拷贝出来 2。chmod 777 -R ./* 给文件权限 3。sudo /home/xx/A/setup 4。安装licenseserver 5。拷贝lic,log文件 6。打开license sudo ./lmgrd -c path 7. 27011@xx or 27011@localhost ...

a1099313374的博客 1950

sementation fault

段错误主要指访问的内存地址超出了系统给这个进程的内存空间。 通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度...

qq_37924084的博客 1846

5G NR LDPC码(2)—— 从基图到速率匹配:解码5G高速数据信道的标准化设计

本文深入解析了5G NR LDPC码的标准化设计流程。从作为核心骨架的基图(BG1/BG2)出发,详细阐述了其如何通过扩展因子Z灵活生成实际校验矩阵,并协同传输块大小计算与分段策略。文章重点剖析了基于循环缓存和冗余版本的速率匹配机制,以及其如何高效支撑增量冗余混合自动重传请求,从而确保5G高速数据信道在复杂环境下的可靠与高效传输。

weixin_29206669的博客 271

计算机系统的恶魔之门——详解Segmentation Fault

Segmentation Fault,简称"segfault",是指当程序在访问内存时,操作系统检测到非法的内存访问行为,例如试图读取或写入非法的内存地址,或者试图访问没有权限的内存区域时,操作系统会强制终止程序的执行,并生成一个Segmentation Fault错误信号。Segmentation Fault错误是计算机系统中常见的错误类型,本文从定义、产生原因、调试方法和预防措施等多个方面进行了详细解析。

m0_72410588的博客 1万+

别再只看读写速度了!聊聊手机闪存eMMC、UFS3.1和SSD背后的功耗与体积玄学

本文深入探讨手机闪存技术eMMC、UFS3.1和SSD在功耗与体积设计上的关键差异。通过对比接口技术、封装工艺和温度管理,揭示移动存储如何在有限空间内平衡性能与能效,为消费者提供选购参考。重点关注UFS3.1的差分信号设计和全双工架构带来的显著优势。

weixin_27061475的博客 447

ROS2节点通信实战:用C++手写一个‘智能小车’控制模型(附完整代码)

本文详细介绍了如何使用ROS2和C++构建一个智能小车控制模型,涵盖运动控制节点、电池管理服务、参数动态配置和Rviz可视化等核心功能。通过实战项目演示ROS2节点通信机制,帮助开发者快速掌握机器人开发的关键技术,并提供了完整的代码实现和系统集成方案。

weixin_30607029的博客 260

Segmentation fault到底怎么回事

转自:https://blog.youkuaiyun.com/good123_2014/article/details/48001327 (备注:我的glibc版本是2.12,GCC版本4.4.6,内核版本2.6.32-279) Linux上开发时最恼火的就是遇到“Segmetation Fault”错误。为什么这么说,很多人看到这个错误后心里第一反应是程序访问的非法的内存,导致其被操作系统强行终止。...

xcw_1987的博客 5597

探秘Segmentation Fault错误:程序猿的噩梦

Segmentation Fault(通常缩写为SegFault或SIGSEGV)是一种指示程序运行时内存访问错误的错误。当程序尝试访问未分配给它的内存区域,或者访问已被释放的内存,系统会产生Segmentation Fault错误。这个错误通常导致程序崩溃,是程序猿们经常遇到的一种错误类型。Segmentation Fault错误是程序开发中常见而又令人头疼的问题。通过深入了解其原因和调试方法,我们可以更好地理解如何预防和解决这类错误。

聚娃科技开发者博客 2136

关于发那科机器人抓手及物料搬运阀配置

4:确保抓手阀岛和输入模块配网连接正常,MENU—SETUP—MH Valves—Details,详细界面进入到左上图所示,根据每组阀分配夹钳数量并应用。3:设置搬运有效,抓手是否带点焊可以自行选择,要设置应用选择,物料搬用工具数量,工具上阀岛的数量,夹钳存在数量,工具存在数量,以及真空吸盘,冷启动。​2:MENU—应用选择,将搬运置为有效,剩余其他项根据机器人实际用途进行选择。5:设置夹钳数量,检查打开夹钳,检查闭合夹钳,延迟时间要给选择配置应用。

dxs93的博客 4772

apollo自动驾驶进阶学习之:如何实现施工路段限速绕行及其参数调试

首先需要理解Planning模块是基于Scenario、Stage、Task这样的层次来进行的,即场景->步骤->具体的决策方法。Apollo可以应对自动驾驶所面临的不同道路场景,都是通过Scenario统一注册与管理。Scenario通过一个有限状态机来判断选择当前行车场景,每个Scenario下又有多个Stage,指当前场景下需要执行的粗略步骤。.........

qq_41593516的博客 6596

C语言中用stop,C语言中It stop with signal SIGSEGV ,segmentation fault.解决方法

C语言中It stop with signal SIGSEGV ,segmentation fault.题目:我的代码:#include#includetypedefstructLNode{intdata;structLNode*next;}LNode,*LinkList;LinkListcreate(LinkListL,intn);LinkListreverse(LinkL...

weixin_32522079的博客 1299

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

1.31(segmentation fault)

#include <stdio.h> int a[1000000]; //这个数组要定义在main的外面,因为直接在main()里定义是有限制的,是放在栈内存中的,而栈内存是有限的 int main() { double pmax=0,pmin=2147483647,nmax=-2147483648,nmin=0; double psum=0,nsum=0; ...

qq_45866495的博客 182

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

gcc编译出现segmentation fault的错误

segmentation fault 即段错误,一般都是出现了非法的地址写操作导致的。 常见的有如下几种情况: 1、空指针访问。 如果指针为空(NULL), 那么对空指针的读写操作都会导致segmentation fault。 如 1 2 3 char *p = NULL; printf("%c",*p);//读操作

Faith的博客 5656

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

3 Segmentation fault (core dumped) ./a.out Exited with error status 139的决解办法

出现错误的原因是空指针 通过以下实例说明 #include <stdlib.h> #include<stdio.h> int main() { int *m; //默认初始化为NULL printf("It' OK here.\n"); printf("*m = %d\n",*m); //使用NULL指针导致segmentation fault. printf("Is here OK?\n"); return 0;

Austin_的博客 1万+

如何创造/处理一个segmentation fault (core dumped)

segmentation fault (core dumped)是一个曾经让我非常头疼的报错,当然它还有一种中文形式,段错误(核心已转移)。 这种错误可能会在各种程序中出现,每次我都用软件名加报错信息去搜索,对于一些常见软件,我能够找到一些解决方案,于是我能按照它们提供的方式进行解决。而对于一些比较小众的软件,就几乎无解了。 直到我学习「c和指针」,我自己创造出了一个段错误,我终于...

xuzhougeng blog 956

C语言变量值丢失、segmentation fault

当我们新手在写C的时候,由于结构把握不好,会出现很多的

caoyicheng1的专栏 1904

内存越界居然不Segmentation fault (core dumped)

环境:linux和gcc #include <stdio.h> #include <time.h> #include <stdlib.h> int main() { srand((unsigned)time(NULL)); int n=4; double *A=malloc(sizeof(double)*n); A[0] =123; A[1] =123;A[2] =123;A[3] =123;A[4] =123; A[9999] =123; free(.

fgh123的博客 436

C语言杂记 0x0B

首先看两个例子 一、 二、 这两个例子里面不同的地方就是s的不同,C语言程序在执行的时候内存分配有这样的规则 局部变量在栈中自动生成内存,比如上面所说的s[]就是在栈中生成内存 而s*指向的内存在常量区,就类似于我们在所有程序之前声明char s[100]一样 栈由编译器自动生成释放,而常量区的内存是由操作系统决定的 回到咱们之前说的那个,两份代码返回的s都指向第一个字母的内存地址,第一个...

Anhongzhan的博客 2044

eclipse+CDT调试segmentation fault错误

先来看两段代码-- 错误代码: #include "string.h" #include #include void test(char ** dest, char * src, int n) { (*dest) = (char*) malloc(sizeof(char) * n); strcpy(*dest, src); } int main(int argc, char** a

M=54G 1965

结构体对齐,与 触发 segment fault 为什么是 1024*132 ,而不是1024*128

按理说 malloc 的size 是 1024*128,这里却需要 1024*132才能及时触发 segmentation fault。

eloudy的专栏 374

linux 中使用结构体指针 segmentation fault

今天在编写一个linux的应用程序时用到了结构体指针, 在创建了结构体 typedef struct u_nit {  int reg;  float value;  char flag; } unit; 之后,又用unit * unit1; 然后unit1->

lieyanluohao的专栏 824

C 语言中指针初始化为字符串常量 不可通过该指针修改其内容

1 char b[] = "hello"; 2 则“hello”存于栈中,因为定义的是一个数组。 3 4 char *b = "hello"; 5 则"hello"存于静态存储区中,因为定义了一个字符串常量,并把它的地址赋给了b。 6 如果此时在指针仍然指向静态存储区的情况下通过指针修改其指向的地方,则程序能通过编译,但运行时会报“segmention fault” 转载...

weixin_34255055的博客 250

Linux下C语言嵌汇编

原文地址:Linux下C语言嵌汇编 作者:torresliang Using Assembly Language in Linux. Intel和AT&T汇编语法差异: 1。前缀: Intel汇编寄存器和立即数无需前缀。后者寄存器前缀为%,立即数前缀为$。 eg:    Intex Syntax    mov eax,1    mov ebx,0ffh    int 80

flyyang的专栏 716

为什么写C程序在结束时不需要系统调用exit?

为什么写C程序在结束时不需要系统调用exit? 一、系统调用exit 众所周知,一个程序的执行和结束,都是需要发起系统调用。 调用execve系统调用,让操作系统加载该程序,调用exit系统调用,表示程序要退出,让操作系统清理空间。 写过汇编语言的都知道,一般都会使用下面的语句来(以Intel汇编为例)发起系统调用exit: mov eax,1 int 0x80 这是发起系统调用exit,用于程序退出。 但是,在C语言中,却没有这样系统调用退出的代码。 ?你说这个东西太偏了,没用? 接着看下面的代码。 二

m0_55708805的博客 508
上一篇: 字符串反转
下一篇: 数据结构:线性表
ScrapingBoy
博客等级 码龄9年 79粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值