今天先上代码:
例如
我们都知道strlen这个函数嘛,传的参数是地址,然后访问遇到\0就统计前面的字符个数。strlen 函数返回的是字符串的长度,其单位是字符个数。
strlen 的功能是计算一个指定字符串的长度,函数原型为 size_t strlen(const char *s) ,它会从字符串的首地址开始向后遍历,直到遇到第一个空字符 '\0' 停止,并返回遇到 '\0' 之前的字符个数。
在你提供的代码中, strlen(arr) 和 strlen(arr + 0) 都能正确计算字符串 "abcdef" 的长度,输出结果为 6,即字符串中的字符个数。而 strlen(*arr) 、 strlen(arr[1]) 、 strlen(&arr) 、 strlen(&arr + 1) 等用法是不正确的,可能会导致未定义的行为或错误的结果。
需要注意的是, strlen 函数返回的是 size_t 类型,也就是 unsigned int 类型,它是一个无符号整数。在使用 strlen 函数时,要确保传入的参数是有效的字符串首地址,即指向以空字符 '\0' 结尾的字符数组的指针。
所以这张图片里面的图片就是:
以下是对这段 C 语言代码的分析:
strlen 函数用于计算字符串的长度,但要注意传递给 strlen 的参数必须是有效的字符串首地址。
- strlen(arr) : arr 是字符串数组,其本身代表数组首地址,所以能正确计算字符串 "abcdef" 的长度,输出 6。
- strlen(arr + 0) : arr + 0 等价于 arr ,也是数组首地址,输出 6。
- strlen(*arr) : *arr 是数组的首元素 'a' ,不是字符串首地址,会导致未定义行为。
- strlen(arr[1]) : arr[1] 是字符 'b' ,不是字符串首地址,会导致未定义行为。
- strlen(&arr) : &arr 是数组的地址,但是是指向字符串首地址,所以也可以往后访问。
- strlen(&arr + 1) : &arr + 1 跳过整个数组,然后指向下一个我们没开辟的空间。这里vs2019编译器打印出来是有值的,但是我觉得跳过这个数组往下访问,有值,也算非法访问了,毕竟我们都没开辟。
- strlen(&arr[0] + 1) : &arr[0] + 1 是字符串 "bcdef" 的首地址,计算长度输出 5。
在实际编程中,应避免使用不恰当的参数调用 strlen 函数,以防止出现未定义的行为和错误。