首页 > 解决方案 > 表达式必须是指向完整对象类型的指针,为什么在这种情况下会出现此错误?

问题描述

这是我的情况的简化:

头文件.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

你建议我怎么做?

标签: cansi-c

解决方案


  1. 错误消息说你不能有用地使用声明extern char reserved[][];,因为编译器至少需要数组的第二维才能知道如何访问数组的某些部分——所以它需要是extern char reserved[][4];. 通过该声明,很明显"I love Stack Overflow"(无论分词和大小写如何)太长而不能等于数组中的任何字符串,但这有点偶然。

  2. 你不能有用地比较这样的字符串——你需要使用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


推荐阅读