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

问题描述

这是我的情况的简化:

header.h

#DEFINE NUMBER 3
extern char reserved[][];

definer.c

char reserved[NUMBER][4] = {"WOW","LOL","K"}

sign.c

#include "header.h"
void theFunctionWithTheError{
    
       if (reserved[1] == "I love stackoverflow"){ /**THE LINE OF THE ERROR*/
       return;
    }
}

在sign.c中,出现错误 表达式必须是指向完整对象类型的指针 reserved

一词

你建议我做什么?

解决方法

  1. 该错误消息指出,您不能有效地使用声明extern char reserved[][];,因为编译器至少需要数组的第二维才能知道如何访问数组的各个部分—因此它必须为{ {1}}。通过该声明,可以立即清楚地发现extern char reserved[][4];(无论是否有断字和大写字母)都太长,无法与数组中的任何字符串相等,但这有点偶然。

  2. 您不能像这样有用地比较字符串-您需要使用"I love Stack Overflow"。参见How do I check if a value matches a string?How do I properly compare strings?以及其他许多可能的SO问题。

    您有:

    strcmp()

    您需要:

    if (reserved[1] == "I love stackoverflow")
    

    或等效值。使用集合if (strcmp(reserved[1]),"I love Stack Overflow") == 0) strcmp(A,B)0op中的任何==,将!=>=的结果进行显式比较,如果字符串是C中的真实内置类型,则<=>与您从<获得的结果匹配。

,

您的代码有问题:

  1. 缺少参数列表,即使为空,也必须在函数定义中提供括号;

  2. 必须使用strcmp()函数在C中进行字符串比较。您不能对字符串使用==运算符。

    #include <string.h>

    #define NUMBER 3

    char reserved[NUMBER][4] = { "WOW","LOL","K" };

    void theFunctionWithTheError(void){

       if (strcmp("I love stackoverflow",reserved[1]) == 0)
       {
          return;
       }
   }