千修鸣 2022-06-02 19:01 采纳率: 0%
浏览 19

c语言中strlen()函数使用的一些疑惑,求解?

#include <stdio.h>
#include <string.h>
int main()
{
    char chs[3] = {'a','b','c'};
    printf("chsLength = %ld\n",strlen(chs));
    return 0;
}

chs字符数组末尾没有加'\0'结束标志,但为什么在Linux(或者其他的编译器上)得到的结果是正确的,为3。
如果是在线编译器就是一个随机值(是正确的结果)

不知道哪位兄弟知道原因

这是相应的版本信息

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --enable-bootstrap --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
  • 写回答

1条回答 默认 最新

  • 逍遥xiaoy 2022-06-02 21:44
    关注

    strlen(char*)函数求的是字符串的实际长度,它求得方法是从开始到遇到第一个'\0',如果你只定义没有给它赋初值,这个结果是不定的,它会从数组的首地址一直找下去,直到遇到'\0'停止。
    其实如果定义的数组更多一些的话,比如在一个结构中使用多个数组的话,这些数组的地址是连续的,所以这个长度求出来也不一定是对的。所以对于不同的编译器而言,编译规则的不同,可能会给地址的映射带来影响。
    谭浩强老先生的《C程序设计》中关于变量名的描述:
    “变量名实际上是一个符号地址,在对程序编译连接时由系统给每一个变量名分配一个内存地址。在程序中从变量中取值,实际上是通过变量名找到相应的内存地址,从其存储单元中读取数据。”变量名不会占用内存,编译后就不存在了,只是在编译时编译器需要占用内存地址来保存变量名与地址的映射关系。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月2日

悬赏问题

  • ¥15 依据报错在原代吗格式的基础上解决问题
  • ¥15 在虚拟机中安装flash code
  • ¥15 单片机stm32f10x编写光敏电阻调节3.3伏大功率灯亮度(光强越大灯越暗,白天正常光强灯不亮,使用ADC,PWM等模块)望各位找一下错误或者提供一个可实现功能的代码
  • ¥20 verilog状态机方法流水灯
  • ¥15 pandas代码实现不了意图
  • ¥15 GD32H7 从存储器到外设SPI传输数据无法重复启用DMA
  • ¥25 LT码在高斯信道下的误码率仿真
  • ¥45 渲染完成之后将物体的材质贴图改变,自动化进行这个操作
  • ¥15 yolov5目标检测并显示目标出现的时间或视频帧
  • ¥15 电视版的优酷可以设置电影连续播放吗?