[C]字符串行为

时间:2024-05-01 00:51:54

未事先分配长度的字符串变量声明,占用内存空间是这个字符串长度 + 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);//
printf("%d\n", len_2);//
}

示例代码中:

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[] = "trial";
int len_1 = strlen(str_1);
int len_2 = sizeof(str_1); printf("%d\n", len_1);//
printf("%d\n", len_2);//
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[] = "trial\0";
int len_1 = strlen(str_1);
int len_2 = sizeof(str_1); printf("%d\n", len_1);//
printf("%d\n", len_2);//
printf("%s\n", str_1);//trial
}

这是一个正确的示范:

strlen输出了正确的字符串长度5;

sizefo输出了正确的变量大小6;

printf输出了正确的字符串"trial";