代码之家  ›  专栏  ›  技术社区  ›  Dor

char*指向一个文本字符串(硬连接到源代码中)是否正常?

c
  •  3
  • Dor  · 技术社区  · 16 年前

    char*变量指向一个字符串(写在源代码中)可以吗?
    只要不超过字面字符串的长度,我可以操作/修改为字面字符串分配的空间吗? 虽然我很了解可执行文件的格式,但是我想确定一下。谢谢:

    4 回复  |  直到 16 年前
        1
  •  9
  •   Carl Norum    16 年前

    在一定程度上取决于您的运行时特性,但一般来说,执行如下操作:

    char *s = "a literal string";
    s[3] = 'q';
    

    将编译,但在运行时不工作。在这种情况下,文本字符串通常位于可执行文件的只读部分。但是,下面的示例将起作用:

    char s[] = "a literal string";
    s[3] = 'q';
    

    在这种情况下,文本字符串是数组的初始化器( s )在堆栈上。所以第一个问题的答案是“是”,第二个问题的答案是“也许”。

    这两个例子在语义上有区别。第一个创建指向文本字符串的指针,第二个创建数组并用文本字符串的内容对其进行初始化。

        2
  •  2
  •   Jon Benedicto    16 年前

    char*变量指向一个字符串(写在源代码中)可以吗?

    通常可以,但我会将指针标记为const,以防止无意中进行修改。

    例子: const char *Str = "This is a hard string.";

    只要不超过字面字符串的长度,我可以操作/修改为字面字符串分配的空间吗?

    我不推荐这个。如果需要修改字符串,请将其复制到已分配的内存块中。

        3
  •  1
  •   Carl Norum    16 年前

    文字字符串总是常量。你可以指向它们,但不能写在上面。您有两种选择:

    1. 实际数组:

      char s[] = "Hello you beautiful people";
      

      这是因为您没有指向文本字符串;您正在将数组(可写)初始化为文本字符串的内容。

    2. 将字符串复制到可写内存:

      char *s = malloc(30);
      strncpy(s, "Hello you beautiful people", 30);
      
        4
  •  1
  •   John Bode    16 年前

    试图修改字符串文字会调用未定义的行为。最好将字符串文本视为不可写的。