sizeof 和 strlen 计算数组大小和长度详解

您所在的位置:网站首页 字符串长度怎么算strlen sizeof 和 strlen 计算数组大小和长度详解

sizeof 和 strlen 计算数组大小和长度详解

2023-12-25 11:18| 来源: 网络整理| 查看: 265

sizeof

首先 sizeof 并非为一个函数,而是C语言中的一个关键字。 sizeof 计算对象所占内存的大小,也就是空间大小,它不存在 ‘\0’,也不会去找’\0’,所以不受其影响, 判断操作数的类型长度,以字节为单位; 指针在32位系统占4个字节,在64位系统占8个字节,本实例都在32位机器上操作。 sizeof 求大小看的仅仅是它的类型大小,而非其他。所以我们在计算时只要认清楚它的类型大小就行。

arr 和 &arr 的区别. int arr[10] = { 0 ); arr -> 本意为数组arr 的第一个元素的地址,但是在 sizeof (arr) 中被特殊化为求整个数组 arr 的大小(这是一个特例),所以 sizeof (arr) = 40; &arr -> 意思为整个数组的内存地址,所以 sizeof (&arr) = 4;(因为它是一个数组指针)

arr + 1 和 &arr + 1 的区别 arr 为首元素的地址 *,arr + 1 -> 即加了一个int * (4)的大小. &arr 为数组的地址, 数组的地址 + 1 -> 即跳过了整个数组的大小,所以相当于加了 40;

char arr[] = { 'a', 'b', 'c', 'd' }; 1. printf("%d\n", sizeof(arr)); //4 2. printf("%d\n", sizeof(arr + 0)); //4 3. printf("%d\n", sizeof(*arr)); //1 4. printf("%d\n", sizeof(arr + 1)); //4 5. printf("%d\n", sizeof(arr[1])); //1 6. printf("%d\n", sizeof(&arr)); //4 7. printf("%d\n", sizeof(*&arr)); //4 8. printf("%d\n", sizeof(&arr + 1)); //4 9. printf("%d\n", sizeof(&arr[0])); //4 10. printf("%d\n", sizeof(&arr[0] + 1)); //4 整个数组的大小(特例)= 4数组首元素的地址,类型为 char* = 4数组首元素,类型为 char = 1数组第二个元素的地址, 类型为 char* = 4同3数组的地址,类型为char (*) [4] = 4先求数组地址,在解应用,相当于求数组大小,同1取数组地址再 + 1 ,相当于跳过整个数组,类型为 char (*)[4] = 4数组首元素的地址, 类型为 char * = 4数组第二个元素的地址,类型为 char * = 4

char arr[] = "abcd"; printf("%d\n", sizeof(arr)); //5 printf("%d\n", sizeof(*&arr)); //5

别忘了这种初始化模式系统会默认给末尾补一个 ‘\0’,所以是5, 其他的和 是一样的。

strlen

strlen 是库函数,使用时须引用其头文件 它存在 ‘\0’,会去找’\0’,所以会受到 '\0’的影响 它的格式为 size_t strlen(const char * str); (必须传 const char * 类型的指针)

char arr[] = { 'a', 'b', 'c', 'd' }; char arr[] = { 'a', 'b', 'c', 'd', '\0' }; //自己添加 '\0' 1. printf("%d\n", strlen(arr)); // 随机值 2. printf("%d\n", strlen(arr + 0)); //随机值 3. printf("%d\n", strlen(*arr)); //类型不匹配 4. printf("%d\n", strlen(arr[1])); //类型不匹配 5. printf("%d\n", strlen(&arr)); //类型不匹配 6. printf("%d\n", strlen(&arr + 1)); //类型不匹配 7. printf("%d\n", strlen(&arr[0] + 1)); //随机值

出现随机值的原因是这样定义的数组后面没有 ‘\0’,,所以 strlen 不能精确判断结束条件,有可能在超出数组很多后才停止。要想避免上述情况,建议用下面的方式进行初始化,或者自己在字符末尾加上 ‘\0’, 加上后的效果和 是一样的.

char arr[] = "abcd"; 1. printf("%d\n", strlen(arr)); // 4 2. printf("%d\n", strlen(arr + 0)); //4 3. printf("%d\n", strlen(*arr)); //类型不匹配 4. printf("%d\n", strlen(arr[1])); //类型不匹配 5. printf("%d\n", strlen(&arr)); //类型不匹配 6. printf("%d\n", strlen(&arr + 1)); //类型不匹配 7. printf("%d\n", strlen(&arr[0] + 1)); // 3

这种定义方式系统会自动在字符串的末尾位置添加 ‘\0’,所以不会出现随机值的问题。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3