C2100错误:非法间接寻址
我不理解这个错误(C2100:非法间接寻址)。我在底部附近标记了三个实例。我在网上看过了,我知道这和我的指针有关,但在这8个小时之后,我完全迷路了。这里可能还有其他一些错误,但我甚至不能说,因为我无法编译它。请帮忙&我希望能有一个我能理解的解释,这样我就可以找出我在未来做错了什么C2100错误:非法间接寻址,c,pointers,function-parameter,C,Pointers,Function Parameter,我不理解这个错误(C2100:非法间接寻址)。我在底部附近标记了三个实例。我在网上看过了,我知道这和我的指针有关,但在这8个小时之后,我完全迷路了。这里可能还有其他一些错误,但我甚至不能说,因为我无法编译它。请帮忙&我希望能有一个我能理解的解释,这样我就可以找出我在未来做错了什么 // INCLUDE FILES #include <stdio.h> #include <string.h> // PROGRAM CONSTANTS #define MAX_MSG
// 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);
}
//包含文件
#包括
#包括
//程序常数
#定义最大消息长度81//最大消息长度(包括/0个字符)
//功能原型
无效打印长度(int,int);//用于验证和打印字符串长度的函数
无效打印字符串(int,char);//函数以反向打印字符串
无效写入文件(int,char);
//全局变量
字符输入[MAX_MSG_LEN];//输入字符串
int maxLength=MAX\u MSG\u LEN-1;//实际字符串长度(不包括/0字符)
char*ptr=input;//字符串的字符指针
int length=0;//当前字符串的长度
int lcv=0;//回路控制变量
void main()
{
文件*ifp;
ifp=fopen(“reverseString.txt”,“w”);
printf(“\n\n输入一个介于1和%d个字符之间的字符串:”,maxLength);//提示用户输入一个小于80的字符串
获取(输入);//从用户处接收输入的字符串
length=strlen(输入);//计算输入字符串的长度并将数字指定给“length”变量
打印长度(长度,最大长度);
打印字符串(长度,*ptr);
写入文件(长度,*ptr);
}
无效打印长度(int-length,int-maxLength)
{
如果(长度>最大长度)
{
printf(“\n\n超过了%d个字符的最大长度!”,maxLength);
printf(“\n程序终止…\n\n”);
出口(0);
}
printf(“\n\n输入字符串的长度为:%d\n”,Length);//打印输入字符串的长度
}
无效打印字符串(整数长度,字符ptr)
{
对于(;lcv0;长度--)
{
printf(“%c”,*ptr);//这里是C2100的一个实例
*ptr--;//这里是C2100的一个实例
}
printf(“\n\n”);
返回;
}
void writeToFile(int-length,char-ptr)
{
文件*ifp;
ifp=fopen(“reverseString.txt”,“w”);
fprintf(ifp,'%c',*ptr);//这里是C2100的一个实例
fclose(ifp);
}
在代码中,语法错误。您需要更改声明和定义
到
就这样说吧
printString(length, ptr);
writeToFile()函数也是如此
否则,对于当前代码,在printString()
和writeToFile()
函数中,定义为char ptr
,ptr
不是可以取消引用的指针类型
也就是说
- 切勿使用
gets()
,它会遇到缓冲区溢出问题,请改用
- 在使用返回的指针之前,请始终检查
fopen()
中的返回值,以确保调用成功
- 为符合标准,
void main()
至少应为int main(void)
我尝试在DevC++IDE上编译您的代码,发现您的代码有3个问题。我将列举如下
1) 按照Saurav Ghosh的建议,尝试更改函数printString()
和writeToFile()
的声明
2) 包含stdlib.h
头以支持exit()
功能,因为exit()
的定义在stdlib.h
3) 将void main(){/*您的代码*/}
更改为int main(){/*您的代码*/}
我做了上述更改,并在我的机器上成功编译了它 当您修复printString
中的错误时,请注意,您实际上并不需要第一个循环,只需执行ptr+=length
。您也不需要为length
赋值,因此您不需要全局变量lcv
(这很好,应该避免全局变量)。您从main发送ptr的内容,基本上是字符串(char*ptr
)。函数将其作为单个字符(char ptr
)接受,然后逻辑尝试在变量ptr(*ptr
)中获取字符的内容。难怪它失败了。现在效果很好!谢谢你的解释,我真的迷路了@musikluver2003欢迎:)void main()
在许多情况下是标准允许的,就标准而言,main的格式没有太多限制。看见例如,Visual Studio允许void main()
作为impl。定义了行为,这很好,因为他们已经记录了它。请注意,决定main格式的是编译器,而不是程序员。@Lundin谢谢,先生,我已经知道那篇文章了。就在大多数情况下,托管环境,intmain(void)
似乎是合适的,以防我们不打算使用命令行参数void main()
也是可以接受的,但是int main(void)
是首选。如果我错了,请纠正我。thanks@SouravGhosh没有偏好。C99和C11只是说“或者以某种实现定义的方式”。当然,如果您编写的程序依赖于main的实现定义形式,那么该程序将不可移植。至于独立式系统(OP很可能是这样的),void main()
非常常见,因此在实践中总是可移植的。
void printString(int, char*);
printString(length, ptr);