zoukankan      html  css  js  c++  java
  • [C]字符串行为

    未事先分配长度的字符串变量声明,占用内存空间是这个字符串长度 + 1,1用于保存结束标识

    #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
    ", len_1);//5
        printf("%d
    ", len_2);//6
    }

    示例代码中:

    str_1的字符长度是5,所以调用strlen返回5;

    不过str_1的实际占用空间是6,这是因为编译器帮助你自动分配了一个字节,用于保存字符串结尾的;

    事先分配长度的字符串变量声明,要保留1个字节保存结尾

    #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
    ", len_1);//6
        printf("%d
    ", len_2);//5
        printf("%s
    ", str_1);//tria
    }

    上述是一个“错误”的代码演示:

    字符串"trial"本身长度为5,但是一旦不给它预留一个结尾空间,将会导致某些函数输出意料之外的结果;

    strlen输出了6,显然这是一个错误的结果,因为strlen只会根据识别字符串是否已是结尾位置;

    sizeof输出了5,这是正确的,因为sizeof返回的是这个变量的大小值;

    printf输出"tria",显然这也是一个错误的结果;

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(void)
    {
        char str_1[6] = "trial";
        int len_1 = strlen(str_1);
        int len_2 = sizeof(str_1);
    
        printf("%d
    ", len_1);//5
        printf("%d
    ", len_2);//6
        printf("%s
    ", str_1);//trial
    }

    这是一个正确的示范:

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

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

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

  • 相关阅读:
    Vue Router详细教程
    Vue CLI使用
    百度点选识别,单字90+
    CPU毫秒级 | 极验点选识别
    Linux内核之进程管理
    Linux内核之基本概念
    MySQL InnoDB技术内幕:内存管理、事务和锁
    ZooKeeper简介
    分布式一致性协议之ZAB
    图解HTTP读书笔记
  • 原文地址:https://www.cnblogs.com/yiyide266/p/9429332.html
Copyright © 2011-2022 走看看