为什么C语言中strcpy复制到char数组正常,复制到char指针指向的字符串会崩溃
C代码崩溃问题解答
你的核心认知存在偏差:char copy_of_arr[SIZE] 和 char * copy_of_arr 完全不是同类型,二者的内存存储区域、可写权限有本质差异,这是第二段代码崩溃的根本原因。
两段代码的核心差异
- 第一段代码里的
char copy_of_arr[SIZE]是栈上分配的可写字符数组:程序初始化时会把字符串字面量"Try me on the ring, brother."的内容完整拷贝到这块栈内存中,后续对这块内存做写入操作(比如strcpy拷贝内容)完全合法,所以程序可以正常运行。 - 第二段代码里的
char * copy_of_arr是指向字符串字面量的指针:C语言标准规定,直接用双引号定义的字符串字面量存储在进程的只读数据段,本身不允许修改。你直接让指针指向这块只读内存,随后调用strcpy往只读地址写入数据时,会触发操作系统的内存访问权限校验,直接抛出段错误导致程序崩溃,这也是你看不到strcpy之后的打印内容的原因。
补充说明
很多新手会混淆数组和指针的差异:数组在大部分使用场景下会隐式转换为指向首元素的指针,但这只是语法层面的自动转换,不代表二者的本质类型等价。如果你想让第二段写法正常运行,只需要改成char copy_of_arr[] = "Try me on the ring, brother."即可,这种写法和第一段代码逻辑完全一致,是在栈上分配可写数组,自动计算数组长度并拷贝字面量内容。
内容的提问来源于stack exchange,提问作者tetektoza
相关产品推荐
相关产品推荐

