本文主要是介绍E30.【C语言】练习:sizeof和strlen的习题集(B),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Exercise 4:sizeof 字符串
求下列代码打印结果
#define CRT_NO_WARNINGNESS 1
#include <stdio.h>
#include <string.h>
int main()
{char arr[] = "abcdef";printf("%zd\n", sizeof(arr));printf("%zd\n", sizeof(arr + 0));printf("%zd\n", sizeof(*arr));printf("%zd\n", sizeof(arr[1]));printf("%zd\n", sizeof(&arr));printf("%zd\n", sizeof(&arr + 1));printf("%zd\n", sizeof(&arr[0] + 1));return 0;
}
答案速查:
x86环境
x64环境
分析:
☑ printf("%zd\n", sizeof(arr));
注意结果不是6!sizeof()计算占用内存空间的大小,不关心存放的数据,因此算上\0,结果为7(一个字符占一个字节)
☑ printf("%zd\n", sizeof(arr + 0));
arr+0代表首元素的地址,因此sizeof(地址);,结果为4/8
4/8含义:4或8个字节
x86环境:4个字节
x64环境:8个字节
☑ printf("%zd\n", sizeof(*arr));
*arr是首元素,因此sizeof(元素);,又因为char类型,结果为1
☑ printf("%zd\n", sizeof(arr[1]));
arr[1]是第二个元素,因此sizeof(元素);,又因为char类型,结果为1
☑ printf("%d\n", strlen(&arr));
&arr是取整个数组的地址,因此sizeof(地址);,结果为4/8
☑ printf("%zd\n", sizeof(&arr + 1));
&arr是取整个数组的地址,+1跳过整个数组,但仍然是sizeof(地址);,结果为4/8
☑ printf("%zd\n", sizeof(&arr[0] + 1));
&arr[0]是取首元素的地址,+1第二个元素的地址,因此sizeof(地址);,结果为4/8
Exercise5:strlen 字符串(指针版)
#include <stdio.h>
int main()
{char* p = "abcdef";printf("%zd\n", sizeof(p));printf("%zd\n", sizeof(*p));printf("%zd\n", sizeof(p[0]));printf("%zd\n", sizeof(&p + 1));printf("%zd\n", sizeof(&p[0] + 1));return 0;
}
答案速查:
x86环境
x64环境
分析:
☑ printf("%zd\n", sizeof(p));
p是一个指针变量,也就是求指针变量的存储空间,结果为4/8
☑ printf("%zd\n", sizeof(*p));
*p解引用,是首字符a,占一个字节,结果为1
☑ printf("%zd\n", sizeof(p[0]));
p[0]两种理解方式
1.把字符串当作数组,p[0]就是第一个字符a
2.p[0]等价为*(p+0),解引用是字符a
结果为1
☑ printf("%zd\n", sizeof(&p + 1));
&p+1因此sizeof(地址);,结果为4/8
细节说明:
&p是取p的地址,+1则跳过p(+4个或8个字节)
x86下
输入&p
输入&p+1
恰好跳过了完整的p(d8 7b 9e 00)
因此&p+1不是单纯的地址+1!!
☑ printf("%zd\n", sizeof(&p[0] + 1));
这篇关于E30.【C语言】练习:sizeof和strlen的习题集(B)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!