C字符串文字

时间:2015-01-21 19:27:01

标签: c string

我有一些关于字符串文字的基本问题。我尝试过一些类似的问题,但我仍然没有得到它:(。

如果我们有以下程序:

char firstlit[] = "First Literal";
int main()
{
char secondlit[] = "Second Literal";
}

以这种方式初始化的字符串是文字吗?如果是这样,我们怎么能修改它们的价值呢?是否未定义改变其价值观?

它们都存储在数据部分吗?我在某处看到某些数据可以保存在代码段中,为什么会这样?

它们之间的唯一区别是secondlit包含指向字符串初始化的地址的指针,但是我们只能在main中使用这个变量,而firstlit我们可以在整个文件中使用(全局)? 另一个问题:

char *ptr = "Hello";
char secondptr[] = "Hello";

它们的存储方式实际上是否相同?用于字符串文字的更好方法是什么? 很抱歉这么多问题。 感谢。

2 个答案:

答案 0 :(得分:3)

firstlit和secondlit都不是文字。它们都是初始化的字符数组。 firstlit在任何函数体之外声明,因此存在于数据段中。它在开始时初始化一次。 secondlit在函数内声明,因此位于堆栈段中。输入功能时会初始化它。

答案 1 :(得分:3)

您的问题中只有一个字符串 - 文字对象:

char *ptr = "Hello"; // The array containing Hello\0

所有其他只是数组的初始值设定项,并且无法保证它们是如何存储的。

  • 字符串文字和常量复合文字可以共享空间并且是不可变的。
  • 尽管如此,由于历史原因,字符串文字的类型为char[]
  • 并不保证它们存储在哪个可执行部分,甚至不存在任何可执行部分。
  • 如果您忽视它们是不可变的这一事实,也无法保证会发生什么。继续自担风险。