如何在函数中获取字符串长度?含指针操作缓冲区长度的问题
C语言函数中获取字符串/缓冲区长度的问题解答
1. 函数中获取字符串长度的方法
要获取字符串长度,直接用标准库函数strlen()即可,但需要注意以下几点:
- 必须包含头文件
<string.h>,否则strlen会因未声明导致编译错误。 strlen的计算逻辑是从起始地址开始,直到遇到'\0'终止符为止,所以字符串必须以'\0'结尾,否则会出现越界读取的未定义行为。- 调用
printf输出长度时,要使用对应size_t类型的格式符%zu,不能直接传strlen的返回值给printf。
针对你给出的代码,存在几个明显错误:
- 缺少
<string.h>头文件; printf没有使用格式符,参数类型不匹配;main中调用fun(&buffer)时,传递的是数组的地址(类型为char (*)[6]),但fun的参数是char*,类型不兼容。
修正后的代码示例:
#include <stdio.h> #include <string.h> void fun(char *buffer) { printf("字符串长度:%zu\n", strlen(buffer)); } int main() { char buffer[] = "Hello"; fun(buffer); // 数组名会自动退化为指向首元素的指针,直接传递即可 return 0; }
2. 函数中用指针获取缓冲区(数组)长度的方法
这里要明确一个关键知识点:当数组作为参数传递给函数时,会自动退化为指向首元素的指针,此时函数内部无法通过这个指针直接获取原数组的长度——因为指针只存储内存地址,不携带数组的大小信息。
常用的解决方法有两种:
方法1:将数组长度作为额外参数传入
这是最通用、符合标准的做法,在调用函数前先计算数组长度,再一起传递给函数:
#include <stdio.h> void fun(char *buffer, size_t buf_len) { printf("缓冲区总长度(含终止符):%zu\n", buf_len); } int main() { char buffer[] = "Hello"; // 计算数组总长度:总字节数除以单个元素的字节数 size_t len = sizeof(buffer) / sizeof(buffer[0]); fun(buffer, len); return 0; }
方法2:使用变长数组(VLA,C99及以后标准支持)
可以在函数参数中指定数组的大小,此时函数内部可以通过sizeof获取数组长度:
#include <stdio.h> // 注意参数顺序:先传长度,再传变长数组 void fun(size_t buf_len, char buffer[buf_len]) { printf("缓冲区总长度:%zu\n", buf_len); printf("通过sizeof获取的长度:%zu\n", sizeof(buffer) / sizeof(buffer[0])); } int main() { char buffer[] = "Hello"; fun(sizeof(buffer)/sizeof(buffer[0]), buffer); return 0; }
如果是动态分配的缓冲区(比如用malloc/calloc分配的内存),标准C没有提供直接获取分配内存大小的函数,部分编译器(如GCC)提供非标准的malloc_usable_size(),但不具备可移植性。建议在分配内存时就记录下长度,将长度和指针一起传递给函数。
内容的提问来源于stack exchange,提问作者user19986697
相关产品推荐
相关产品推荐

