C语言通过函数指针传递字符串无法正确计算长度问题
代码问题定位与修正方案
你的代码存在两处违反C语言类型匹配规则的错误,直接导致传参失效、长度计算结果完全不可信:
错误1:函数指针的形参签名和实际指向的函数完全不匹配
- 你在
myfunc里写的形参是int (*countlength)(char ch),这个定义代表:这个函数指针指向的函数,需要接收1个单个char类型的入参,返回int值。 - 但你实际要传入的
countlength函数,签名是int countlength(char* word),需要的入参是char类型的字符串指针*。 - 两者类型完全对不上,这是C语言标准里明确规定的未定义行为,编译器不会帮你兜底:正常编译时就会抛出类型不匹配的警告,要是强制跳过警告硬跑,函数调用时的栈参数布局会直接错乱,被调用的函数拿到的入参根本不是你传的字符串地址。
错误2:给函数传数组时多写了&,导致类型不兼容
- C语言里,数组名在传参的时候会自动退转成指向数组首元素的指针,对于
char word[10]来说,这个退转后的类型就是char*,刚好匹配countlength的形参要求。 - 你额外加了
&取数组的地址,拿到的是char (*)[10]类型的“指向长度为10的char数组的指针”——虽然这个值在内存数值上和数组首地址碰巧一致,但它和形参要求的char*类型并不兼容,会让strlen拿着错误的引用一直往后读内存,直到撞见随机的\0结束符,算出离谱的长度值。
修正后的可运行代码
#include <stdio.h> #include <string.h> int countlength(char* word); // 把函数指针的签名改成和countlength完全匹配的形式 void myfunc(int (*countlength)(char* word)){ char word[10] = "Hello\n"; // 直接传数组名,去掉多余的&,靠自动退转得到char*类型的首地址 int result = countlength(word); printf("Length of word: %d\n", result); } int countlength(char* word) { int length = strlen(word); return length; } int main() { myfunc(countlength); return 0; }
补充:你之前在main函数里跑相同的长度计算逻辑能正常出结果,是因为当时你是按照正确的
char*类型直接传字符串,既没有错配函数指针的签名,也没有多写&导致类型不兼容,参数传递全程符合C语言的类型规则,strlen能正常遍历到字符串末尾的\0,算出正确长度。上面的修正代码运行后,会输出Length of word: 6,也就是Hello\n的实际字符数(H、e、l、l、o、换行符,一共6个字符)。
内容的提问来源于stack exchange,提问作者jiux1
相关产品推荐
相关产品推荐

