字符串指针的一些注意事项

最近使用strcpy的时候遇到一些以前没注意的坑,尤其是使用字符串指针的时候!这里做一个总结。

首先我们需要明白一件事情:当一个字符串指针指向的是一个字符串常量的时候,是不能通过该指针修改字符串的内容的!原因很简单:字符串常量是存储在文字常量区的,而文字常量区的内容是可读不可写,所以不能修改。

//"hello world"这个字符串常量是存储在文字常量区的,s1是在栈区开辟的一个指针变量,里面存储"hello world"字符串的首地址
char* s1 = "hello world";
s1[1] = 'X';//错误,文字常量区不可修改

字符串指针与字符数组的区别

字符串指针可以有如下形式:

  • 字符串指针指向一个字符串常量;
  • 字符串指针指向一个字符数组;
  • 用malloc开辟一段空间存储,返回地址是一个字符串指针。(类似在堆上开一个数组空间)

而字符数组就没啥特殊的,跟int数组差不多;就是在栈空间上开辟一段空间存储数组元素。数组名就是数组空间的首地址。

另外:

strcpy的指针参数不能为空;当然dst指针也不能为指向字符串常量的字符串指针。

char* s1 = "hello world";
char* s2;
char str[20];

strcpy(str, s1);//正确,将一个字符串常量拷贝给字符数组str

s2 = "";
strcpy(s2, s1);//错误,dst不能是一个不能修改的常量

//strcpy(s2, s1);//错误,s2未初始化:声明一个变量并不分配空间

s2 = NULL;
//strcpy(s2, s1);//错误,s2指针为空

//注:新加入的说明,示例::
char* m;
strcpy(m, s1);//错误!! 为什么? 因为m只是一个char*类型的指针,它本身并没有空间存储一个字符串!只能将这个m的指针指向某一个字符串!!

所以一定要注意字符数组和字符串指针的区别!

字符数组是一个数组空间,而字符串指针只是一个指针变量!它本身只有一个4B的空间存储该指针,并不能去存储一个字符串!它只能去指向一个字符串!

另外,一个字符串指针指向一个堆空间,那人家也是一个指针变量指向一个堆空间!所以一定要注意字符指针的使用!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值