首页 > 编程知识 正文

c++ 字符串常量,c语言字符串常量有哪些

时间:2023-05-04 08:48:07 阅读:277974 作者:2882

遇到了一个有关常量字符串的问题,发现我对此的理解还不是很清楚,甚至存在误区!!

文章目录 1.字符串常量不可修改2.错误示例3.使用字符数组char a[] = "abcd";为什么不会出错?4.总结

1.字符串常量不可修改 当我们使用char *p = “abcd”;定义一个字符型指针指向"abcd"时,使用指针p试图去修改字符串的内容是错误的!

看图:

可以看到出现了segmentation fault。

解释:因为"xxx",此种类型的字符串被称为常量字符串,它存储在计算机的常量存储区中。而常量存储区也就意味着我们不能对其进行更改。(太久没遇见以至于我居然将这么重要的知识点都忘记了!)我们使用char *p = “hang”;也就意味着p内存储的地址是位于常量存储区中的地址。 2.错误示例

而我遇到的具体问题是什么呢?我把代码简化之后,大家看下面的demo:

char *a[2] = {“abcd”, “bcda”};

strcpy(a[0], “bbbb”);

大家看出问题了没?在运行的时候在strcpy的时候发生了segmentation fault。

解释:char *a[2];是一个指针数组,a[0]和a[1]都是存储指针的。当我们将"abcd"赋值给a[0]时,因为"abcd"的首地址处于常量存储区,这就意味着我们将一个常量存储区地址赋给了a[0]。而strcpy的作用是什么?从某个位置开始依次每字符进行内存拷贝,遇到’’结束,而在这里也就是把"bbbb"依次拷贝到以a[0]为首地址的一段常量存储区中去!但是我提到了常量存储区中的数据是无法改变的,所以引发了segmentation fault。 3.使用字符数组char a[] = “abcd”;为什么不会出错?

首先要知道我们利用char a[] = “abcd”;开辟的连续的内存空间是位于系统栈中的。我们开辟了这样一段地址,并利用常量字符串"abcd"来初始化这个数组(或者是赋值这段内存)。
所以常量字符串在这的作用是初始化系统栈中的内存,所以我们明白了以a为首地址的连续内存位于系统栈而非常量存储区,因此我们能够更改它。
代码示例:
char a[] = “abcd”;

strcpy(a, “cccc”);

此时进行的内存拷贝就是正确可行的。

4.总结 常量字符串位于常量存储区,不可改变。一旦改变就会报错。常量字符串可以初始化字符数组,字符数组可以改变,没有任何问题。利用常量字符串初始化的字符数组可以改变,原因是字符数组的内存分配在系统栈中,而非常量存储区,可以进行改变。C语言博大精深

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。