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

  • 相关阅读:
    Using Generic containers in Delphi XE always?
    (转)如何在 Delphi 中静态链接 SQLite
    超级巡警免疫文件夹(无害) 无法删除的解决办法
    Delphi 从剪贴板拷贝文件示例代码
    电子书下载:Distributed Game Development: Harnessing Global Talent to Create Winning Games
    从普通函数到对象方法 Windows窗口过程的面向对象封装
    Delphi快捷键
    Windows下搭建和配置Subversion服务器
    MIUI直刷正确开启A2SD+的方法
    Delphi2007升级到Delphi 2010总结
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/11638056.html
Copyright © 2011-2022 走看看