设为首页 加入收藏

TOP

操作系统大型实验进展(9)-----strlen()和sizeof(二)
2014-11-23 23:20:59 来源: 作者: 【 】 浏览:7
Tags:操作系统 大型 实验 进展 -----strlen sizeof
是第一个字符
  大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度
  这就是sizeof(x)可以用来定义数组维数的原因
  char str[20]="0123456789";
  int a=strlen(str); //a=10;
  int b=sizeof(str); //而b=20;
  大部分编译程序 在编译的时候就把sizeof计算过了 是类型或是变量的长度
  这就是sizeof(x)可以用来定义数组维数的原因
  char str[20]="0123456789";
  int a=strlen(str); //a=10;
  int b=sizeof(str); //而b=20;
  char ss[] = "0123456789";
  sizeof(ss) 结果 11 ===》ss是数组,计算到\0位置,因此是10+1
  sizeof(*ss) 结果 1 ===》*ss是第一个字符
  char ss[100] = "0123456789";
  sizeof(ss) 结果是100 ===》ss表示在内存中的大小 100×1
  strlen(ss) 结果是10 ===》strlen是个函数,内部实现是用一个循环计算到\0之前为止
  int ss[100] = "0123456789";
  sizeof(ss) 结果 400 ===》ss表示再内存中的大小 100×4
  strlen(ss) 错误 ===》strlen的参数只能是char* 且必须是以'\0'结尾的
  char q[]="abc";
  char p[]="a\n";
  sizeof(q),sizeof(p),strlen(q),strlen(p);
  结果是 4 3 3 2
  第二个例子
  class X
  {
  int i;
  int j;
  char k;
  };
  X x;
  cout<
  cout<
  第三个例子
  char szPath[MAX_PATH]
  如果在函数内这样定义,那么sizeof(szPath)将会是MAX_PATH,但是将szPath作为虚参声明时(void fun(char szPath[MAX_PATH])),sizeof(szPath)却会是4(指针大小)
  还有一位网友的说明也很好:
  其实理解 sizeof 只需要抓住一个要点:栈
  程序存储分布有三个区域:栈、静态和动态。能够从代码直接操作的对象,包括任何类型的变量、指针,都是在栈上的;动态和静态存储区是靠栈上的指针来间接操作的。sizeof 操作符,计算的是对象在栈上的投影体积;记住这个就很多东西都很清楚了。
  char const * static_string = "Hello";
  sizeof(static_string) 是 sizeof 一个指针,所以在 32bit system 是 4
  char stack_string[] = "Hello";
  sizeof(stack_string) 是 sizeof 一个数组,所以是 6 * sizeof(char)
  char * string = new char[6];
  strncpy(string,"Hello",6");
  sizeof(string) 是 sizeof 一个指针,所以还是 4。和第一个不同的是,这个指针指向了动态存储区而不是静态存储区。
  不管指针指向的内容在什么地方,sizeof 得到的都是指针的栈大小
  C++ 中对引用的处理比较特殊;sizeof 一个引用得到的结果是 sizeof 一个被引用的对象的大小;所以
  struct O
  {
  int a,b,c,d,e,f,g,h;
  };
  int main()
  {
  O & r = *new O;
  cout << sizeof(O) << endl; // 32
  cout << sizeof r << endl; // 也是 32
  system("PAUSE");
  }
  r 引用的是整个的 O 对象而不是指向 O 的指针,所以 sizeof r 的结果和 sizeof O 完全相同。
自定义函数实现strlen()函数的功能
  下面几种实现strlen函数的源代码大家参考
  -------------------------------------------------1:start------------------------------------
  #include
  #include
  typedef unsigned int u_int;
  u_int Mystrlen(const char *str)
  {
  u_int i;
  assert(str != NULL);
  for (i = 0; str[i]!= '\0'; i++);
  return i;
  }
  ------------------------------------------------1:end--------------------------------------
  -------------------------------------------------2:start--------------------------------------
  int strlen(const char *str)
  {
  assert(str != NULL);
  int len = 0;
  while((*str++) != '\0')
  len++;
  return len;
  }
  ------------------------------------------------2:end ------------------------------------------
  ------------------------------------------------3:start------------------------------------------
  int strlen(const char *str)
  {
  assert(str);
  const char *p = str;
  while(*p++!=NULL);
  return p - str - 1;
  }
  -------------------------------------------------3:end--------------------------------------
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇操作系统大型实验进展(3)-----C.. 下一篇操作系统大型实验进展(5)-----C..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: