zoukankan      html  css  js  c++  java
  • 字符导致的不便

            char字符数组是非常原始的,容易发生一些奇怪的事情。先看一下下面的代码及程序运行结果:

    <span style="font-size:18px;">#include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int x = 9252;
        char str1[5] = "abcde", str2[3] = "fgh";
        int i;
    
        printf("The elements of str1 : ");
        for(i=0; i<5; i++)
            printf("%c ", str1[i]);
        printf("
    ");
        printf("The elements of str2 : ");
        for(i=0; i<3; i++)
            printf("%c ", str2[i]);
        printf("
    ");
    
        printf("----------------------------
    ");
    
        printf("str1 : %s
    ", str1);
        printf("str2 : %s
    ", str2);
        printf("The length of str1 : %d
    ", strlen(str1));
        printf("The length of str2 : %d
    ", strlen(str2));
    
        printf("----------------------------
    ");
    
        char str3[9];
        for(i=0; i<5; i++)
            str3[i] = str1[i];
        for(i=0; i<3; i++)
            str3[i+5] = str2[i];
        str3[9] = '';
    
        printf("str3 : %s
    ", str3);
        printf("The length of str3 : %d
    ", strlen(str3));
        return 0;
    }
    </span>

            str1 和 str2分别声明为char[5]、char[3],然而abcde、fghi字符串要在字符结束的地方加上NULL,分别需要6、4个字符的空间,但是代码中只分别为其分配了5、3个字节的空间。因此,abcde后面的NULL字符以及fgh后面的NULL字符都没能放入而被舍弃了。故而在显示str2时,首先显示fgh,然后是显示与之相邻的空间里保存的abcde。

           函数开始部分的int x=9252;语句在内存中写入的整数9252。9252用16进制表示就是2424,在ASCII码中24是$。因此这个整数被解释为有两个$并列的字符串的一部分。与之相邻的内存中是00,被当做是NULL字符,显示到此终止。然而,在某些情况下可能显示出更多的内容,并且有可能会试图读取那些禁止读取的内容,从而造成程序的异常终止。

           用str3[9]来存放abcde、fghi字符串,结尾处加上’’,再输出str3,这样就正常了。


  • 相关阅读:
    vscode远程开发
    iframe父子组件传值
    react项目地址栏添加包名
    记一次lombok踩坑记
    Android Adb修改系统时区 NTP 服务器
    ES文件浏览器4.1.9.7.4任意文件浏览漏洞
    SUID提权之python的os.setuid(0)提权
    PHP-8.1.0-dev 后门命令执行
    将博客搬至CSDN
    零基础快速上手HarmonyOS开发1---为什么要学习HarmonyOS?如何能快速上手?HarmonyOS架构解析、和Android深度对比
  • 原文地址:https://www.cnblogs.com/Genesis2018/p/8304762.html
Copyright © 2011-2022 走看看