c - 表达式必须是指向完整对象类型的指针,为什么在这种情况下会出现此错误?
问题描述
这是我的情况的简化:
头文件.h
#DEFINE NUMBER 3
extern char reserved[][];
定义者.c
char reserved[NUMBER][4] = {"WOW","LOL","K"}
标志.c
#include "header.h"
void theFunctionWithTheError{
if (reserved[1] == "I love stackoverflow"){ /**THE LINE OF THE ERROR*/
return;
}
}
在 sign.c 中,我得到错误Expression must be a pointer to a complete object type
for the wordreserved
你建议我怎么做?
解决方案
错误消息说你不能有用地使用声明
extern char reserved[][];
,因为编译器至少需要数组的第二维才能知道如何访问数组的某些部分——所以它需要是extern char reserved[][4];
. 通过该声明,很明显"I love Stack Overflow"
(无论分词和大小写如何)太长而不能等于数组中的任何字符串,但这有点偶然。你不能有用地比较这样的字符串——你需要使用
strcmp()
. 请参阅如何检查值是否与字符串匹配?以及如何正确比较字符串?在许多其他可能的 SO 问题中。你有:
if (reserved[1] == "I love stackoverflow")
你需要:
if (strcmp(reserved[1]), "I love Stack Overflow") == 0)
或同等学历。如果字符串是 C 中真正的内置类型,则显式比较
strcmp(A, B)
使用set 、、、或中的0
任何结果的结果。op
==
!=
>=
<=
>
<
A op B
推荐阅读
- javascript - 带有反应的 DraftJs,装饰器不起作用
- java - 在一组元素中找到一个复杂元素
- python - 如何使用python增加图像的大小?
- python - 如何在每个月的最后一个数据之后打印一些文本?
- r - 为什么插入符号假设 BestModel = 最小化 CV 度量而不是像 LASSO 中的最小 + 1se 的那个?
- jquery - jquery验证中不需要动态字段
- android-studio - 删除特定改造请求中的标头 Android Studio
- spring - Spring Boot SLF4j Logback
- azure-data-explorer - Kusto:连接时的全表扫描甚至连接条件是基于时间的?
- python - 训练多个分类器并比较指标