[C]字符串行为
未事先分配长度的字符串变量声明,占用内存空间是这个字符串长度 + 1,1用于保存\0结束标识
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char str_1[] = "trial"; int len_1 = strlen(str_1); int len_2 = sizeof(str_1); printf("%d\n", len_1);//5 printf("%d\n", len_2);//6 }
示例代码中:
str_1的字符长度是5,所以调用strlen返回5;
不过str_1的实际占用空间是6,这是因为编译器帮助你自动分配了一个字节,用于保存字符串结尾的\0;
事先分配长度的字符串变量声明,要保留1个字节保存结尾\0
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char str_1[5] = "trial"; int len_1 = strlen(str_1); int len_2 = sizeof(str_1); printf("%d\n", len_1);//6 printf("%d\n", len_2);//5 printf("%s\n", str_1);//tria }
上述是一个“错误”的代码演示:
字符串"trial"本身长度为5,但是一旦不给它预留一个\0结尾空间,将会导致某些函数输出意料之外的结果;
strlen输出了6,显然这是一个错误的结果,因为strlen只会根据\0识别字符串是否已是结尾位置;
sizeof输出了5,这是正确的,因为sizeof返回的是这个变量的大小值;
printf输出"tria",显然这也是一个错误的结果;
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char str_1[6] = "trial\0"; int len_1 = strlen(str_1); int len_2 = sizeof(str_1); printf("%d\n", len_1);//5 printf("%d\n", len_2);//6 printf("%s\n", str_1);//trial }
这是一个正确的示范:
strlen输出了正确的字符串长度5;
sizefo输出了正确的变量大小6;
printf输出了正确的字符串"trial";