【问题标题】:"Semantic issue: Implicitly declaring library function 'malloc' with type 'void *(unsigned long)'"“语义问题:隐式声明库函数 'malloc' 类型为 'void *(unsigned long)'”
【发布时间】:2015-04-24 08:14:17
【问题描述】:

我有一段代码,我试图在括号内抓取一个表达式,然后使用它。在下面的代码开始处,我正在遍历一个字符数组,pcc 是指向当前字符的指针,它已被确定为'('。我的目标是将副表达式放入字符数组pe

            int nnrp = 1; /* Net number of right parantheses */
            char * pbpe = pcc; /* Pointer to the beginning paranthetical expression */
            for (++pcc; *pcc!= '\0' && nnrp != 0; ++pcc)
            {
                if (*pcc == '(')
                {
                    ++nnrp;
                }
                else if (*pcc == ')')
                {
                    --nnrp;
                }
                else if (*pcc == '\0')
                {
                    sprintf(err, "Unbalanced paranthesis");
                    return -1;
                }
            }
            /* If we're here, *pcc is the closing paranathesis of *pbpe */
            long nel = pcc - pbpe; /* New expression length */
            if (nel == 1)
            {
                sprintf(err, "Empty parenthesis");
                return -1;
            }
            char * pe = (char*)malloc(nel+1); /* Paranthetical expression */
            strncpy(pcc+1, pcc, nel);
            pe[nel] = '\0';

但是我的 IDE (XCode 6.0) 给了我警告

“语义问题:隐式声明库函数 'malloc' 类型为 'void *(unsigned long)'”

strncpy(pcc+1, pcc, nel); 线上。我想知道

  1. 为什么我会收到此警告。
  2. 我是否需要修复它
  3. 如果您在我的代码中可以看到任何其他问题。

提前致谢。

【问题讨论】:

  • 我希望隐式声明的类型为 int (long) 而不是 void *(unsigned long)... 好奇:这是哪个编译器(哪个版本和哪个选项)?
  • Clang 给出了这个警告,-std=c89-std=c99。这不是隐式函数声明的传统方式(链接如下),Clang 选择了malloc正确 声明并发出警告(C99 要求;在 C89 中,代码只是未定义)。有趣。

标签: c pointers malloc character-arrays


【解决方案1】:

尝试将此行添加到文件顶部:

#include <stdlib.h>

这将引入malloc 的显式声明,因此您不应收到该警告。

您可能会收到警告,因为您忘记在文件中包含 stdlib.h。编译器对您很好,并为您提供了 malloc 的隐式声明,以便代码能够编译。通常,最好包含显式声明,以便编译器真正知道您要调用哪种函数,并且修复所有可以修复的警告也很好,这样您的构建过程就会干净并且您可以注意到更重要的警告。所以是的,你应该修复它。

【讨论】:

  • @LilyCarter:您还应该从malloc 调用中删除(char *) 演员;这不是必需的,如果您忘记包含stdlib.h 或在范围内没有malloc 的声明,则在较旧的编译器下会抑制有用的诊断。请注意,在 C++ 中, 必需的,但如果您正在编写 C++,则应该使用 new 运算符而不是 malloc
  • 在 C a cast shouldn't be used 中。并且该问题中还解释了隐式声明
  • 我遇到了同样的问题。 #include 没有为我解决问题,但 #include 解决了。
猜你喜欢
  • 2014-07-12
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 2012-10-17
相关资源
最近更新 更多