You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言if语句判断指针时恒为true或NULL的报错原因

错误原因

两个版本的编译错误都来自同一个指针误用:判断strchr返回值时多加了取地址运算符&。
先明确两个基础逻辑:

  1. strchr的返回值规则:在目标字符串中查到指定字符时,返回指向该字符位置的char*类型指针;查不到时返回NULL空指针。你定义的char *letter就是用来存储这个返回值的。
  2. &是取地址运算符,&letter的含义是「获取指针变量letter自身在内存中的存储地址」——只要你声明了letter这个变量,它就会被分配固定的内存空间,这个地址永远不可能为NULL,所以编译器会直接判定你的判断逻辑是恒真/恒假的无效代码,直接报错:
    • 版本1的if(!&letter):&letter永远是非零值,取反后永远为假,判断永远不会触发
    • 版本2的if(&letter == NULL):letter的内存地址不可能是空,这个判断永远不成立
修正代码

只需要删掉判断语句里多余的&,直接判断letter存储的返回值是否为空即可,修正后的核心逻辑:

//check if every letter of the alphabet is present in the text string.
// 更推荐直接用字符串字面量初始化字母表,自动带'\0'终止符,不容易出问题
char alphabet[] = "abcdefghijklmnopqrstuvwxyz";
char *letter;
char buf[strlen(codetext) + 1];
strcpy(buf, codetext);
for(int i = 0; i < 26; i++)
{
    letter = strchr(buf, alphabet[i]);
    // 直接判断返回值是否为空,两种写法等价:if(letter == NULL) 或 if(!letter)
    if(!letter)
    {
        printf("Key must contain every alphabetic character. \n");
        return 1;
    }
}
补充说明

你原来的alphabet初始化方式是逐个写字符的数组,没有加字符串终止符'\0',当前逐个取元素传参给strchr不会触发问题,但如果后续要对alphabet直接用字符串处理函数,会出现越界访问的问题,换成字符串字面量初始化的写法可以规避这个隐患。

内容的提问来源于stack exchange,提问作者Sarah Cohen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 17:06:27