C语言if语句判断指针时恒为true或NULL的报错原因
错误原因
两个版本的编译错误都来自同一个指针误用:判断strchr返回值时多加了取地址运算符&。
先明确两个基础逻辑:
strchr的返回值规则:在目标字符串中查到指定字符时,返回指向该字符位置的char*类型指针;查不到时返回NULL空指针。你定义的char *letter就是用来存储这个返回值的。&是取地址运算符,&letter的含义是「获取指针变量letter自身在内存中的存储地址」——只要你声明了letter这个变量,它就会被分配固定的内存空间,这个地址永远不可能为NULL,所以编译器会直接判定你的判断逻辑是恒真/恒假的无效代码,直接报错:- 版本1的
if(!&letter):&letter永远是非零值,取反后永远为假,判断永远不会触发 - 版本2的
if(&letter == NULL):letter的内存地址不可能是空,这个判断永远不成立
- 版本1的
修正代码
只需要删掉判断语句里多余的&,直接判断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
相关产品推荐
相关产品推荐

