(C语言)习题练习 (sizeof和strlen)
复习 sizeof
有关sizeof 在上一张中已经已经讲解了
在本章进行复习,更深入了解sizeof 的计算
请各位读者老爷进行计算一下。看看各位的实力。
题目如下:
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
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;
}
公布答案:
1. sizeof(arr) arr是数组名,单独放在sizeof内部.计算的是数组的大小 - 6 (a,b,c,d,e,f)六个
2. sizeof(*arr+0) arr是数组名,是数组首元素的地址, arr+0也是数组首元素的地址,是地址就是 4 / 8(在两种的环境下答案不一样)x64 x86
3. sizeof (*arr) arr是数组首元素的地址,*arr就是首元素.大小是1个字节
4. sizeof(arr[1]) arr[1]是第二个元素,大小是1个字节
5. sizeof(&arr) &arr是数组的地址,数组的地址也是地址,大小是 4 / 8个字节(同2)
6.sizeof (&arr +1)&arr是数组的地址, &arr + 1 就 是跳 过整个数组,指向了 f 的后面. 4 / 8个字节
7. sizeof(&arr[0] + 1) & arr [0] + 1是第二个元素的地址,大小就是 4 / 8
strlen
接下来就是strlen函数了,还记得定义嘛?
-
strlen:
strlen
是一个函数,用于计算以空字符\0
结尾的字符串中的字符个数。- 它不包括字符串末尾的
\0
字符。 strlen
在运行时计算其值,因此需要包含string.h
头文件。- 参数必须是字符型指针(
char*
),且必须是以\0
结尾的字符串。
晓得了定义,那么上习题!!
如下:
#include <string.h>
int main()
{
char arr[] = { 'a','b','c','d','e','f' };
printf("%zd\n", strlen(arr));//随机值;arr是首元素的地址,数组中没有\0,一直往后找,什么时候遇到\0不清楚
printf("%zd\n", strlen(arr + 0));//随机值;arr是首元素的地址,arr+1依然是首元素的地址
printf("%zd\n", strlen(*arr));//*arr是首元素,是'a' - 97,传给strlen函数,97会被当做地址.
以97作为地址,会形成非法访问,程序会崩溃
printf("%zd\n", strlen(arr[1]));//arr[1]是第2个元素,就是'b' - 98,传给strlen函数,98会被当做地址.同上,程序崩溃
printf("%zd\n", strlen(&arr));//&arr是数组的地址,虽然是数组的地址,值和首元素的地址样.strlen依然是从第一个
字符的位置开始向后找\0,会得到随机值.
printf("%zd\n", strlen(&arr + 1));//&arr + 1是f后面的地址,什么时候遇到\0,依然不知道.随机值.
printf("%zd\n", strlen(&arr[0] + 1));//&arr[0]+1就是第二个元素的地址,得到的也是随机值
return 0;
}
公布答案:
1. 随机值 因为在本数组中没有\0所以说它会一直往后寻找直到\0。
2. 随即值 arr是首元素的地址,arr +0仍然是首元素的地址
3. 崩溃 *arr是首元素,是'a' - 97,传给strlen函数,97会被当做地址.,以97作为地址,会形成非法访问,程序会崩溃
4.崩溃 arr[1]是第2个元素,就是'b' - 98,传给strlen函数,98会被当做地址.同上,程序崩溃
5.随机值 &arr是数组的地址,虽然是数组的地址,值和首元素的地址一样.strlen依然是从第一个字符的位置开始向后找\0,会得到随机值.
6 随机值 &arr + 1是f后面的地址,什么时候遇到\0,依然不知道,所以还是随机值.。
7.随机值 &arr[0]+1就是第二个元素的地址,得到的也是随机值