char* 和char[] 内存分配的区别

本文探讨了C语言中char*和char[]声明字符串时的内存分配差异。char*指向的字符串常量存放在.rodata段,不可修改,而char[]在栈上分配内存,允许直接赋值。这种差异可能导致尝试修改字符串常量时出现段错误。通过示例代码和分析,阐述了strcpy等函数处理字符串常量的行为。
摘要由CSDN通过智能技术生成
char * s1 = "abcd";
s1[0] = 'm';//segment fault
 

上面代码在gcc下编译运行将报段错误。

然而,

char s1[] = "abcd";
s1[0] = 'm';

这段代码则能够正确运行。其中包含的原理是char* 和 char[],在内存分配上的机制差异。

对于char *  s = "abcd";来说, 编译器会将字符串字面量当作常量数据处理,存放在.rodata段,这样以来,s将指向.rodata段中的某处内存,

因此对该段内存的修改会引起段错误。(另,printf等格式化字符串函数中的format string 如"%d"等也会被放在.rodata中。)

对于char s1[] = "abcd";来说,"abcd"是在栈上分配内存,使用mov指令直接将值写入栈上对应内存。

使用下面代码来验证上面的描述:

#include <stdio.h>

int main()
{
	char * s1 = "abcd";
	char s2[] = "efghef";
}

查看汇编指令:

cString.o:     file format
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值