c 语言中对字符串常量修改的错误原因解析
2021/6/12 10:21:02
本文主要是介绍c 语言中对字符串常量修改的错误原因解析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
对字符串常量进行修改
#include <stdio.h> int main() { char *a = "hello"; // 字符串常量 a[0] = 'w'; printf("%s\n", a); return 0; }
运行以上代码会出现如下错误: Segmentation fault
,即段错误。
错误解析
将上述代码编译成汇编代码如下。从中可以看出,字符串常量被声明在 rodata 节,即只读数据节(read only data)。因此尝试对字符串修改,即会引发段错误。
.section .rodata ; 只读数据节开始 .LC0: .string "hello" ; 声明的字符串常量 char *a = "hello"; .text .globl main .type main, @function main: .LFB0: pushl %ebp movl %esp, %ebp subl $20, %esp movl $.LC0, -12(%ebp) movl -12(%ebp), %eax movb $119, (%eax) ; 尝试对字符串修改 a[0] = 'w'; subl $12, %esp pushl -12(%ebp) call puts addl $16, %esp movl $0, %eax
对字符串数组进行修改
include <stdio.h> int main() { char a[]="hello"; a[0] = 'w'; printf("%s\n", a); return 0; }
将其编译成汇编如下,可以看出,字符串被拷贝到堆栈上,因此对其修改没有问题。
main: pushl %ebp movl %esp, %ebp movl $1819043176, -18(%ebp) ; $ebp-18 = "hell" movw $111, -14(%ebp) ; $ebp-14 = "o\0" movb $119, -18(%ebp) ; a[0] = 'w'; subl $12, %esp leal -18(%ebp), %eax pushl %eax call puts addl $16, %esp movl $0, %eax
这篇关于c 语言中对字符串常量修改的错误原因解析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享