You need to enable JavaScript to run this app. C语言通过函数指针传递字符串无法正确计算长度问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 12:54:03