C 获取错误“;赋值从整数生成指针,不带强制转换;
嘿,我是C新手,代码有问题 当我运行这部分代码时,我得到一个错误:C 获取错误“;赋值从整数生成指针,不带强制转换;,c,pointers,compiler-errors,C,Pointers,Compiler Errors,嘿,我是C新手,代码有问题 当我运行这部分代码时,我得到一个错误: Cmd* GetCommand() { Cmd* command; char* cmdStr = getIn(); command = parseL(cmdStr); return command; } Cmd** parseL(char* str){ Cmd** command; char*
Cmd* GetCommand() {
Cmd* command;
char* cmdStr = getIn();
command = parseL(cmdStr);
return command;
}
Cmd** parseL(char* str){
Cmd** command;
char* token;
char str2[CMD_MAX_LINE_LENGTH];
strcpy(str2, str);
token = strtok(str2, DELI);
command = ParC(token);
return command;
}
Cmd* parC(char* cmdStr) {
Cmd* command = calloc(1, sizeof(CmdCommand));
if (cmdStr == NULL) {
command->cmd = INVALID;
return command;
}
else
parse2C(cmdStr, command);
return command;
}
对于这一行:
assignment makes pointer from integer without a cast.
命令
来自类型Cmd*
,而且函数parseL
返回Cmd*
,因此我无法找出问题所在。编译器看到的那一刻
command = parseL(cmdStr);
它还不知道parseL()
返回的是哪种类型,因为后面的代码中定义了它
对于这种情况,C标准定义了许多编译器将int
作为返回类型
由于命令
被定义为指针,编译器将阻塞并发出警告:
回避这个问题
- 或者定义整个函数
- 或者至少提供该功能的原型
error assignment makes pointer from integer without a cast
作为旁注:
您将遇到下一个错误,因为
Cmd**
与Cmd*
不同 声明的顺序在C中很重要。在使用函数之前定义它们。您忘记了包含错误的行号!当然,一个聪明的人可能会发现它,但最好包括整个错误。它会给你一个行号。顺便说一句,如果你需要互相调用函数,你不能先定义一个再定义另一个,所以你需要拆分函数声明和定义()。我不认为你是这样,但是把所有的声明放在上面会使定义顺序变得不重要。你忽略了另一个警告。永远不要忽略警告无论你做什么,都不要添加强制转换来抑制(措辞糟糕的)警告。事实上,当前标准、以前的标准和之前的标准都不会假定int
;他们说“错误”。许多编译器仍然允许使用“defaultint
”,但除了最初的C90(C89)标准之外,其他任何标准都不允许这样做。所有其他版本都要求在调用函数之前知道类型。你不一定要有一个完整的原型;在调用每个函数之前,必须对其进行声明(或定义)。@JonathanLeffler:感谢您的关注…:}
error assignment makes pointer from integer without a cast
Cmd** parseL(char*);