c语言 字符数组 字符指针 sizeof strlen 的区别

直接给代码 char *c="abcdef"; char d[]="abcdef"; char e[]={'a','b','c','d','e','f'}; printf("sizeof(c):%d\tstrlen(c):%d\n",sizeof(c),strlen(c)); printf("sizeof(d):%d\tstrlen(d):%d\n",sizeof(d),strlen(d)); printf("sizeof(e):%d\tstrlen... c',sizeof(c); printf("sizeof(c):%d\,':%d\n"tstrlen(c):%d\n";b'; char e[]={'abcdef",'f'tstrlen(e):%d\,这些数据在内存中怎么存放,机器读取时候的机制,谢谢;,',sizeof(e),strlen(c)); printf("a':%d\tstrlen(d);abcdef"sizeof(d);,',strlen(e)); 输出结果是 4 6 7 6 6 14 求原因,最好是把根本原因说出来;,sizeof(d),strlen(d));d'; char d[]="};n"; printf("sizeof(e):%d\直接给代码 char *c=",'e' 展开

第1个回答  2019-12-18
  简单概括,strlen()返回的是字符数组或者字符指针中的元素个数,sizeof返回的是字符数组中所有元素所占的总字节数,对于字符指针,返回的只是指针所占的字节数,32位系统上都是4字节。具体来说有如下几点区别:
  1.
sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned
int类型。该类型保证能容纳实现所建立的最大对象的字节大小。
  2.
sizeof是算符,strlen是函数。
  3.
sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。
  4.
数组做sizeof的参数不退化,传递给strlen就退化为指针了。
  5.
大部分编译程序在编译的时候就把sizeof计算过了,是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因。
  char
str[20]="0123456789";
//
str是编译期大小已经固定的数组
  int
a=strlen(str);
//
a=10;
//strlen()在运行起确定,计算的是实际长度
  int
b=sizeof(str);
//
而b=20;
//sizeof()在编译期确定,str的类型是int[20],计算的是占据内存的大小
  6.
strlen的结果要在运行的时候才能计算出来,是用来计算字符串的实际长度,不是类型占内存的大小。
  7.
sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。
  char
c;
  sizeof
c;
//变量名可以不加括弧
  8.
当适用于一个结构类型或变量,
sizeof
返回实际的大小,
  当适用一静态地空间数组,
sizeof
归还全部数组的尺寸。
  sizeof
操作符不能返回动态地被分派了的数组或外部的数组的尺寸
相似回答