内置函数'malloc'的不兼容隐式声明
incompatible implicit declaration of built-in function 'malloc'
我的程序是
#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标准库中获得定义。
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 字符类型转换不兼容
- Qt:如何使不兼容的发送方/接收方参数兼容?
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 为什么转换函数声明不需要至少一个定义类型说明符
- 使用不兼容的分配器复制分配无序列图
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- 使方法常量后声明不兼容
- 标识符未定义且不兼容的声明
- 绘制SFML船时不兼容的声明
- 收到 CUDA 错误"声明与以前的"variable_name"不兼容
- C++中实现文件中的声明不兼容
- 声明与(方法)指针不兼容
- 为什么boost::bind与正向声明不兼容
- 声明不兼容.(指针)
- 3 智能感知:声明与"<error-type>Airport::getDetails(std::string)"不兼容
- 链表声明与原型不兼容
- 异常规范在声明和功能实现方面不兼容
- 声明不兼容,初学者c++
- 内置函数'malloc'的不兼容隐式声明