当前位置:   article > 正文

C语言基础:数组在内存存储的大小(sizeof,strlen求大小)

C语言基础:数组在内存存储的大小(sizeof,strlen求大小)

整形数组: 

  1. int main()
  2. {
  3. //数组名首元素地址,下面是两个例外
  4. //1.sizeof(数组名)-数组名表示整个数组
  5. //2.&数组名-数组名表示整个数组
  6. int a[] = { 1,2,3,4 };
  7. printf("%d\n", sizeof(a));//计算的是数组总大小,单位是字节-16
  8. printf("%d\n", sizeof(a+0));//此时的a还是首元素地址 32平台4个字节,64平台为8
  9. printf("%d\n", sizeof(*a));//求的是首元素的大小,4个字节
  10. printf("%d\n", sizeof(a+1));//4/8
  11. printf("%d\n", sizeof(a[1]));//4
  12. printf("%d\n", sizeof(&a));//不是16,&a取出的是数组的地址,但是数组的地址那也是地址,地址的大小就是4/8个字节
  13. printf("%d\n", sizeof(*&a));//16 与第一种写法一样
  14. printf("%d\n", sizeof(&a+1));//4/8,虽然跳过整个数组,但是还是地址,
  15. printf("%d\n", sizeof(&a[0]));//4/8
  16. }

字符数组

  1. char arr[] = { 'a','b','c','d','e','f' };
  2. printf("%d\n", sizeof(arr));//6 sizeof计算的是数组大小
  3. printf("%d\n", sizeof(arr+0));//4/8 首元素地址
  4. printf("%d\n", sizeof(*arr));//1 *arr就是首元素,大小一个字节
  5. printf("%d\n", sizeof(arr[1]));//1
  6. printf("%d\n", sizeof(&arr));//4/8 虽然是数组地址,但是还是数组地址
  7. printf("%d\n", sizeof(&arr+1));//4/8
  8. printf("%d\n", sizeof(&arr[0]+1));//4/8 第二个元素的地址

32为平台运行结果: 

 strlen 求字符串长度的函数,遇到\0结束

  1. char arr[] = { 'a','b','c','d','e','f' };
  2. printf("%d\n", strlen(arr));//随机值 没有结束标志\0
  3. printf("%d\n", strlen(arr+0));//与第一种写法相同,还是随机值
  4. printf("%d\n", strlen(*arr));//‘a'-97 把97 当做地址,非法访问内存,
  5. printf("%d\n", strlen(arr[1]));//非法访问
  6. printf("%d\n", strlen(&arr));//随机
  7. printf("%d\n", strlen(&arr+1));//随机
  8. printf("%d\n", strlen(&arr[0] + 1));//随机
  1. char arr[] = "abcdef";
  2. printf("%d\n", sizeof(arr));//7 计算的是整个数组大小,单位是字节
  3. printf("%d\n", sizeof(arr+0));//4/8 算的是首元素地址的大小
  4. printf("%d\n", sizeof(*arr));//*arr是首元素,首元素大小是1个字节
  5. printf("%d\n", sizeof(arr[1]));//1
  6. printf("%d\n", sizeof(&arr));//4/8 算的是地址的大小 &arr虽然是数组的地址,但是也是地址
  7. printf("%d\n", sizeof(&arr+1));//4/8 &arr+1是跳过整个数组后的地址,还是地址
  8. printf("%d\n", sizeof(&arr [0]+ 1));//4/8
  9. }
  1. char arr[] = "abcdef";
  2. printf("%d\n", strlen(arr));//6 不包括\0 strlen接收的是地址,从那个地址开始找字符串
  3. printf("%d\n", strlen(arr+0));//6
  4. printf("%d\n", strlen(*arr));//非法访问内存 97 当做地址去访问
  5. printf("%d\n", strlen(arr[1]));//非法访问内存 98 当做地址去访问
  6. printf("%d\n", strlen(&arr));//6 会有警告
  7. printf("%d\n", strlen(&arr+1));//随机值
  8. printf("%d\n", strlen(&arr[0]+1));//5

 printf("%d\n", strlen(&arr));

会报错,  &arr-数组的地址,按理说存在数组指针里面 char(*p)[7]=&arr; 元素类型为char(*)[7];

而strlen接收的类型是 const char *,有所冲突 

下面解释一下如下代码:

  1. char* p = "abcdef";
  2. //常量字符串,把a的地址放到p指针
  3. printf("%d\n", sizeof(p));//4/8 a的地址
  4. printf("%d\n", sizeof(p+1));//4/8 b的地址
  5. printf("%d\n", sizeof(*p));//1 a的大小
  6. printf("%d\n", sizeof(p[0]));//int arr[10]; arr[0]==*(arr+0) p[0]==*(p+0) 1
  7. printf("%d\n", sizeof(&p));//4/8 p的地址还是4个字节
  8. printf("%d\n", sizeof(&p+1));//4/8 还是个地址
  9. printf("%d\n", sizeof(&p[0]+1));//b的地址 还是4/8
  1. char* p = "abcdef";
  2. printf("%d\n", strlen(p));//6
  3. printf("%d\n", strlen(p+1)); //5
  4. printf("%d\n", strlen(*p));//报错
  5. printf("%d\n", strlen(p[0]));//报错
  6. printf("%d\n", strlen(&p));//随机值
  7. printf("%d\n", strlen(&p+1));//随机值
  8. printf("%d\n", strlen(&p[0]+1));//5

 二维数组:

 printf("%d\n", sizeof(a[0]+1));

16 第二行的数组名,计算的是第二行的数组大小(错误) 

  1. printf("%p\n", &a[0][0]);
  2. printf("%p\n", &a[0]+1);

他们的值相差4

  1. int a[3][4] = { 0 };
  2. printf("%d\n", sizeof(a));//48 数组总大小,单位字节
  3. printf("%d\n", sizeof(a[0][0]));//4
  4. printf("%d\n", sizeof(a[0]));//16 第一行的数组名,计算的是第一行的数组大小
  5. printf("%d\n", sizeof(a[0]+1));//4 a[0]是第一行数组名,数组名此时是首元素地址,a[0]其实就是第一行第一个元素的地址
  6. //所以a[0]+1就是第一行第二个元素的地址 地址大小是4/8个字节 ????
  7. printf("%d\n", sizeof(*(a[0]+1)));//4 第一行第二个元素,大小是4个字节
  8. printf("%d\n", sizeof(a+1));//a是二维数组的数组名,没有sizeof(a),也没有&a,所以a是首元素地址
  9. //而把二维数组看成一维数组时,二维数组首元素就是他的第一行,a就是第一行的地址 ???
  10. //a+1就是第二行的地址
  11. printf("%d\n", sizeof(*(a + 1)));//16 计算第二行的大小,单位是字节 ???
  12. printf("%d\n", sizeof(&a[0] + 1));//4 第二行的地址,
  13. printf("%d\n", sizeof(*(&a[0] + 1)));//16
  14. printf("%d\n", sizeof(*a));//16,a是首元素地址,第一行地址,*a就是第一行
  15. printf("%d\n", sizeof(a[3]));//16 ????

打???表示不太理解 

结果为:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/621797
推荐阅读
相关标签
  

闽ICP备14008679号