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

时间:2015-06-01 00:12:08

标签: c++ algorithm

我的节目是

#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] = '\0';
    return retstr;
}

int main()
{
   char str [] = "abc3.14def";
   std::cout << grabNumber(str+3); // should print "3.14"
   return 0;
}

我得到的错误是

  

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

对应2行

    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两次,但我不能如果我们遇到第二个.

,我想一个更清洁的方法来处理我需要停止循环的事实

2 个答案:

答案 0 :(得分:2)

我猜你正在尝试编写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];

然后你不需要任何额外的包括。

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

在C ++中,拥有由知道内存管理的容器类管理的内存是更好的方式;所以程序员不能犯任何错误。 (如果你想知道,这通常不会引入任何低效率,甚至可能加快速度。)

更好的方法是#include <string>,使函数返回std::string,并将函数的最后五行更改为:

return { begincpy, begin };

或者如果使用pre-C ++ 11编译器,

return std::string(begincpy, begin);

答案 1 :(得分:1)

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

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