上一页 下一页

C 语言编程基础

关于字符串的特别说明

关于字符串常量的特别说明

假设您创建并运行以下两个代码片段

Fragment 1

{
    char *s;

    s="hello";
    printf("%s\n",s);
}

Fragment 2

{
    char s[100];

    strcpy(s,"hello");
    printf("%s\n",s);
}

这两个片段产生相同的输出,但它们的内部行为却截然不同。在片段 2 中,您不能写 s="hello";。要了解这些差异,您必须了解 C 语言中字符串常量表的工作原理。

广告

当您的程序被编译时,编译器会生成目标代码文件,其中包含您的机器码以及程序中声明的所有字符串常量的表。在片段 1 中,语句 s="hello"; 使 s 指向字符串常量表中字符串 hello 的地址。由于此字符串位于字符串常量表中,因此从技术上讲是可执行代码的一部分,您无法修改它。您只能指向它并以只读方式使用它。

在片段 2 中,字符串 hello 也存在于常量表中,因此您可以将其复制到名为 s 的字符数组中。由于 s 不是指针,语句 s="hello"; 在片段 2 中将不起作用。它甚至无法编译。

关于在字符串中使用 malloc 的特别说明

假设您编写了以下程序

int main()
{
    char *s;

    s=(char *) malloc (100);
    s="hello";
    free(s);
    return 0;
}

它编译正常,但当您运行它时,在 free 行会发生段错误。malloc 行分配了一个 100 字节长的块并使 s 指向它,但现在 s="hello"; 这行成了问题。这在语法上是正确的,因为 s 是一个指针;但是,当执行 s="hello"; 时,s 指向字符串常量表中的字符串,而分配的块则被孤立。由于 s 指向字符串常量表,因此字符串无法更改;free 失败是因为它无法释放可执行区域中的块。

正确的代码如下

int main()
{
    char *s;
    s=(char *) malloc (100);
    strcpy(s,"hello");
    free(s);
    return 0;
}