【问题标题】:C2100 Error: Illegal IndirectionC2100 错误:非法间接
【发布时间】:2016-05-01 10:54:01
【问题描述】:

我不理解这个错误(C2100:非法间接)。我已经在底部附近标记了三个实例。我在网上看过,我知道这与我的指针有关,但是在这 8 个小时之后,我完全迷失了。这里也可能还有其他一些错误,但我什至无法分辨,因为我无法编译它。请帮忙,我希望得到一个我能理解的解释,这样我就可以弄清楚我在未来做错了什么。

// INCLUDE FILES
#include <stdio.h>
#include <string.h>

// PROGRAM CONSTANTS
#define     MAX_MSG_LEN     81      // Maximum Message Length (Including /0 Character)

// FUNCTION PROTOTYPES
void printLength(int, int);         // Function to Validate & Print Length of String
void printString(int, char);        // Function to Print the String in Reverse
void writeToFile(int, char);

// GLOBAL VARIABLES
char input[MAX_MSG_LEN];            // Input String
int maxLength = MAX_MSG_LEN - 1;    // Actual String Length (Not Including /0 Character)
char *ptr = input;                  // Character Pointer to String
int length = 0;                     // Length of Current String
int lcv = 0;                        // Loop Control Variable


void main()
{
    FILE *ifp;
    ifp = fopen("reverseString.txt", "w");

    printf("\n\nEnter a String Between 1 and %d Characters: ", maxLength);  // Prompts User to Enter a String Less Than 80
    gets(input);        // Receives the Inputted String from the User   

    length = strlen(input);     // Counts the Length of the Inputted String & Assigns the Number to the "length" Variable

    printLength(length, maxLength);
    printString(length, *ptr);
    writeToFile(length, *ptr);
}

void printLength(int length, int maxLength)
{
    if(length > maxLength)
    {
        printf("\n\nThe Maximum Length of %d Characters was Exceeded!", maxLength);
        printf("\nProgram Terminated...\n\n");
        exit(0);
    }

    printf("\n\nThe Length of the Input String was: %d\n", length);     // Prints the Length of the Inputted String
}

void printString(int length, char ptr)
{   
    for(; lcv < length; lcv++)
    {
        ptr++;
    }

    length = lcv;
    printf("\nThe String in Reverse: ");

    for(ptr--; length > 0; length--)
    {
        printf("%c", *ptr);     // HERE IS ONE INSTANCE OF C2100
        *ptr--;                 // HERE IS ONE INSTANCE OF C2100
    }

    printf("\n\n");
    return;
}

void writeToFile(int length, char ptr)
{
    FILE *ifp;
    ifp = fopen("reverseString.txt", "w");
    fprintf(ifp, "%c", *ptr);   // HERE IS ONE INSTANCE OF C2100
    fclose(ifp);
}

【问题讨论】:

  • 当您修复printString 中的错误时,请注意您实际上并不需要第一个循环,您只需执行ptr += length。您也不需要分配给length,因此您不需要全局变量lcv(这很好,应该避免使用全局变量)。
  • 您正在从 main 发送 ptr 的内容,基本上是字符串 (char* ptr)。您的函数将其作为单个字符 (char ptr) 接受,然后您的逻辑尝试在变量 ptr (*ptr) 中获取字符的内容。难怪它失败了。

标签: c pointers function-parameter


【解决方案1】:

在您的代码中,您的语法是错误的。您需要更改声明和定义

  void printString(int, char);

  void printString(int, char*);

然后这样称呼它

 printString(length, ptr);

writeToFile() 函数也是如此。

否则,对于当前代码,在printString()writeToFile() 函数中,具有char ptr 之类的定义,ptr 不是可以取消引用的指针类型。

也就是说,

  • 永远不要使用gets(),它会出现缓冲区溢出问题,请改用fgets()

  • 在使用返回的指针之前始终检查来自fopen()的返回值,以确保调用成功。

  • 为了符合标准,void main() 至少应该是int main(void)

【讨论】:

  • 现在很好用!也感谢您的解释 - 我很迷茫!
  • @musikluver2003 欢迎:)
  • void main() 在很多情况下是标准允许的,就标准而言,main 的格式根本没有太多限制。见this。例如,Visual Studio 允许 void main() 作为 impl。定义的行为,这很好,因为他们已经记录了它。请注意,决定 main 格式的是编译器,而不是程序员。
  • @Lundin 谢谢先生,我已经知道那个帖子了。在大多数情况下,托管环境int main(void) 似乎很合适,以防我们不打算使用命令行参数。 void main() 也可以接受,但int main(void) 是首选。如果我错了,请纠正我。谢谢
  • @SouravGhosh 没有偏好。 C99 和 C11 只是说“或以某种实现定义的方式”。但是当然,如​​果您编写的程序依赖于实现定义的 main 形式,则该程序将不可移植。至于独立系统(很可能是 OP),void main() 非常常见,实际上它始终是可移植的。
【解决方案2】:

我尝试在 DevC++ IDE 上编译您的代码,发现您的代码存在 3 个问题。我会列出如下。

1) 尝试按照 Saurav Ghosh 的建议更改函数 printString()writeToFile() 的声明。

2) 包含stdlib.h 标头以支持exit() 函数,因为exit() 的定义在stdlib.h 中可用

3)将void main(){/* your code*/}更改为int main(){/* your code */}

我做了上述更改,并在我的机器上成功编译。

【讨论】:

    猜你喜欢
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    相关资源
    最近更新 更多