"Semantic issue: Implicitly declaring library function 'malloc' with type 'void *(unsigned long)'"

"Semantic issue: Implicitly declaring library function 'malloc' with type 'void *(unsigned long)'"

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

            int nnrp = 1; /* Net number of right parantheses */
            char * pbpe = pcc; /* Pointer to the beginning paranthetical expression */
            for (++pcc; *pcc!= '[=11=]' && nnrp != 0; ++pcc)
            {
                if (*pcc == '(')
                {
                    ++nnrp;
                }
                else if (*pcc == ')')
                {
                    --nnrp;
                }
                else if (*pcc == '[=11=]')
                {
                    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] = '[=11=]';

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

"Semantic issue: Implicitly declaring library function 'malloc' with type 'void *(unsigned long)'"

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

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

提前致谢。

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

#include <stdlib.h>

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

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