zoukankan      html  css  js  c++  java
  • 再论strlen sizeof

    今天,在使用字符串的时候,对sizeof和strlen的用法更加深入了,特此记录下。

    strlen是运行是计算的,不能放在函数外面计算的
    sizeof是预编译时运行的,可以放在函数外面计算。

    对于char a[]="asdc"这样的定义,sizrof(a)的值是5,因为末尾会自动添加一个'',而strlen(a)的值=4,不计算'',

    对于char a[8]="asdc"这样的定义,sizeof(a)的值是8,因为数组a在定义的时候已经大小定好了,最大就是8,而strlen(a)的值依然=4,不计算'',因为在实际内存中,保存的是"asdc"。

    对于char *a="asdcf"这样的定义,sizrof(a)的值是4(32位系统)或8(64位系统),因为这个a其实是一个指针,指向字符常量。无论后面的字符串多长,都是上面的数值。而strlen(a)的值=5,不计算'',其实知道strlen的自定义实现,就知道了strlen含义。

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示
    第一种表示方式固定了每个字符串的最大大小。第二种没有字符串的大小限制。
    对于如下定义,month首先是一个数组,但是,但他里面存的是指针,所以说指针数组,所以sizeof(month)的大小是12×8(64位系统)=96;sizeof(month[0])=8,即一个指针的大小。
    strlen(month[0]) = 7,即"January"的长度是7,而
    strlen(month)无意义,语法非法。编译器报错:warning: assignment from incompatible pointer type
    char *month[] = {
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"};

    对于以下定义,month首先是一个一维数组,但是每个子数组中,都是一个字符串,因此是一个二维数组,我这里为每个子数组定义的大小是15,显然,很多数组没有全部用完。所以sizeof(month[0])的大小是15;即一个子数组的大小。
    strlen(month[0]) = 7,即"January"的长度是7,
    而strlen(month)无意义。编译器报错:expected 'const char *' but argument is of type 'char (*)[15]' _CRTIMP size_t __cdecl __MINGW_NOTHROW strlen (const char*) __MINGW_ATTRIB_PURE;

    char month[][15] = {
    "January",
    "February",
    "March",
    "April",
    "May",
    "June",
    "July",
    "August",
    "September",
    "October",
    "November",
    "December"};

  • 相关阅读:
    sqlite3中给表添加列
    webpack打包后服务端__dirname失效问题
    nodejs查看本机hosts文件域名对应ip
    vscode远程调试node服务端
    git 删除错误commit
    npm安装模块没有权限解决办法
    node gyp编译所需要的环境
    npm和yarn的淘宝镜像添加
    笨办法学Python 笔记
    梯度下降法优化线性回归算法参数
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/11638056.html
Copyright © 2011-2022 走看看