[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";

posted @ 2018-08-06 11:29  yiyide266  阅读(150)  评论(0编辑  收藏  举报