内置函数'malloc'的不兼容隐式声明

incompatible implicit declaration of built-in function 'malloc'

本文关键字:声明 不兼容 malloc 函数 内置      更新时间:2023-10-16

我的程序是

#include <iostream>
char * grabNumber ( char * begin )
{
    // Interpret *begin as the start of a double and add the characters to a
    // string retstr
    char * begincpy = begin;
    int foundDot = 0;
    while ((*begin >= '0' && *begin  <= '9') || *begin == '.')
    {
        if (*begin == '.')
        {
            if (foundDot == 0) foundDot = 1;
            else break;
        }
        ++begin;
    }
    long n = begin - begincpy; // # of characters parsed
    char * retstr = malloc(sizeof(char) * (n + 1)); // string to be returned
    for (long k = 0; k < n; ++k) retstr[k] = *begincpy++;
    retstr[n] = '';
    return retstr;
}
int main()
{
   char str [] = "abc3.14def";
   std::cout << grabNumber(str+3); // should print "3.14"
   return 0;
}

我得到的错误是

第20行:warning:不兼容的内置的隐式声明函数'malloc'第21行:错误:'for'循环初始声明使用C99模式外

对应的两行

    char * retstr = malloc(sizeof(char) * (n + 1)); // string to be returned
    for (long k = 0; k < n; ++k) retstr[k] = *begincpy++;

见:http://codepad.org/c2tNGFEo

还有,是否有一种方法可以减少我的算法的冗余,因为它在while循环的每次迭代中检查两次.,但是我想不出一个更干净的方法来处理如果我们遇到第二个.

我需要停止循环的事实

我猜你正试图写c++,因为你已经包括iostream和使用std::cout。然而,错误消息显示您正在使用C编译器。我猜你也写了gcc myprogram.c。要获得c++编译,您要么需要编写g++而不是gcc,要么将文件重命名为.cc扩展名。(最好是两个).


要使用malloc,您需要#include <cstdlib>

之后可能还需要using namespace std;using std::malloc;;并且需要对malloc返回的值进行强制转换,因为c++不会隐式地将void *转换为其他指针类型。

然而,malloc在c++中很少使用,因为它不能正确初始化非平凡对象。考虑将此代码更改为:

char * retstr = new char[n+1];

则不需要任何额外的include。


但是这仍然是一个弱的设计,因为你现在依靠调用者来释放内存。事实上,你的main函数有内存泄漏,因为它没有释放内存。

在c++中,由一个知道内存管理的容器类来管理内存是更好的风格;所以程序员不会犯任何错误。(如果你想知道,这通常不会导致任何效率低下,甚至可能会加快速度)。

一个更好的方法是返回#include <string>,使函数返回std::string,并将函数的最后五行更改为:
return { begincpy, begin };

或者如果使用c++ 11之前的编译器,

return std::string(begincpy, begin);

让我们从观察你不是在写C开始,你是在写c++。您应该修复编译/项目设置,以便使用c++编译器而不是C编译器编译文件。这将修复关于for循环的编译错误,因为这在C-99之前的C中是无效的。

其次,第一个警告实际上是由于缺少include。在C语言中,你将#include <stdlib.h>在c++中,你将#include <cstdlib>从C标准库中获得定义。