弦乐特别说明
关于字符串常量的特别说明
假设你创建了以下两个代码片段并运行它们:
片段1 {char *s;s =“你好”;printf (" % s \ n ", s);}片段2 {char s[100];strcpy(年代,“你好”);printf (" % s \ n ", s);}
这两个片段产生相同的输出,但它们的内部行为却截然不同。在片段2中,你不能说s =“你好”;.要理解它们的区别,你必须理解18新利最新登入字符串常量表选C。
广告
编译程序时,编译器形成目标代码文件,其中包含您的机器代码和程序中声明的所有字符串常量的表。在片段1中,语句s =“你好”;原因年代指向字符串的地址你好在字符串常量表中。由于该字符串位于字符串常量表中,因此技术上是可执行代码的一部分,因此不能修改它。您只能以只读方式指向它并使用它。
在片段2中,字符串你好也存在于常量表中,因此您可以将其复制到名为年代.由于s不是指针,语句s =“你好”;不会工作在片段2。它甚至不能编译。
使用字符串的特殊注意事项malloc
假设你写了下面的程序:
Int main() {char *s;S =(char *) malloc (100);s =“你好”;自由(s);返回0;}
它编译正确,但给出了分割错误在免费的行,当你运行它。的mallocLine分配了一个100字节长的块,并指向s,但是现在s =“你好”;线路有问题。它在语法上是正确的,因为s是一个指针;18新利最新登入然而,当s =“你好”;执行时,s指向字符串常量表中的字符串,分配的块是孤立的。因为s指向字符串常量表,所以字符串不能被改变;Free失败是因为它不能释放可执行区域中的块。
正确的代码如下:
Int main() {char *s;S =(char *) malloc (100);strcpy(年代,“你好”);自由(s);返回0;}