c++基本常见错误总结

我们无论是在学习中还是在工作当中,总是会遇到各种各样的c++编译错误问题,经常会有一种情况就是上一次好像遇到过这种问题,但是就是想不起来了(我就是这样)所以下面这一篇文章就是总结自己遇到的编译以及运行错误。

注意 :
1、造成错误的原因有很多种,错误提示也是多种多样的,我们只需要截取一小部分进行搜索即可。
2、不同的IDE(集成的开发环境,即你写的代码的那个软件)对相同的错误提示不尽相同。

一、错误汇总

1 Arithmetic exception

算术错误,检查是否出现分母为0等算数错误的情况

示例

printf("%d\n", 1/0);

2 Segmentation fault 或者 Process exited after xxx seconds with return value 一个很大的数(in Dev)

段错误

在Dev中“一个很大的数”的不同对应着不同的问题,其中

3221225477(0xC0000005)对应以下1、2、3点

3221225725(0xC00000FD)对应以下第4点

3221225620(0xC0000094)对应以下第5点)

请检查以下问题 :

2.1 调用没有对象的野指针,建议在定义指针的时候new或者malloc一块空间给它(不要直接给指针赋0)

示例:

int* p;   //p是没有对象的野指针
*p=3;    //对野指针所指区域赋值

建议改成(malloc需要加<stdlib.h>头文件,C++中直接用new),:

int* p=(int*)malloc(sizeof(int));   //malloc函数返回类型是void*,需要强制类型转化一下
int* p=new int;
2.2 指针并不是野指针,但是它指向NULL或者指向受系统保护的区域

比如以下两种情况:

int* p=0int* p=NULL;

建议和2.1一样,分配一块动态内存

另外注意的是,scanf忘记加&,也会因为这个原因报Segmentation fault

如:

int a=0;
scanf("%d",a);    //忘加&
2.3 下标越界,访问某个数组超出其定义下标的值

比如:

int array[3]={0};   //只定义到3
cout<<array[4];     //但是尝试访问下标为4的地方

值得一提的是,现在部分编译器已经将其优化,进而允许用户进行这一危险行为而不会报错,在写代码的时候应该避免访问超出定义的下标

2.4 栈溢出

写递归的时候,递归次数太多

比如:

void operate(){if(true) operate();    //自己调用自己,无限调用else return;
}
2.5.除零错误(in Dev)

Dev独有,同本文第一条错误,分母为零等算式错误

3、输出内容为nan或者inf或者-inf,检查调用函数时是否超出其定义域

nan不存在的数

inf/-inf正负无穷大

比如(以下数学公式需要包含或者<math.h>头函数):

printf("%d\n",sqrt(-1));  //输出nan
printf("%d\n",ln(0));   //输出-inf

4、no match for ‘xxx’ (operand types are ‘xxx’ and ‘xxx’)

没有与这些操作数匹配的"xx"操作符

操作符指的是一些运算符,比如+、-、&&、>>、[]等

操作数是这些运算符所需要操作的对象,比如+运算需要有左右两个数,而++运算是对一个数操作的

出现这个错误一般是操作数的类型与操作符所要求的不匹配,比如(string类型需要头文件):

4.1 使用系统的类时出错,或者尝试对不正确的类型进行运算符操作

比如

string a="abc";
cout<<3+a;   //将一个整数与一个string类型的变量相加,这是+运算不允许的

特别提一下,如果你的报错的对象是">>“、”<<",请检查你的使用是否规范(惨痛的教训),比如:

cin<<a;    //正确的应为cin>>a;
cout>>3;    //正确的应为cout<<3;
4.2 在使用自己定义的类时,尝试使用系统默认的运算符

比如:

class Integer{
public:int a;Integer(int aa):a(aa){}
};
Integer a(1),b(2);
cout<<a+b;     //因为系统的+运算没有对自定义的类的运算方法

建议:

1.自己对+运算符进行运算符重载,,如:

class Integer{
public:int a;Integer(int aa):a(aa){}friend const Integer operator+ (const Integer& a,const Integer& b);	//声明友元
};
const Integer operator+ (const Integer& a,const Integer& b) { return(Integer(a.i+b.i)); }
Integer a(1),b(2);
Integer c=a+b;
cout<<c.a; 

2.访问类中的变量,对类中变量单独进行+运算,如:

cout<<a.a+b.a;

5、launch:program “xxx” does not exist 或者 ld returned 1 exit status(in Dev)

恭喜你成功骗过了编译器,这里的报错是连接器报错了

这时如果你去网上找相关的解决方案,它会建议你去更改launch.json或者task.json文件,但是在进行下一步操作前,请检查你的代码是否有如下错误:

1.main函数缺失或者把main打错了(比如写成mian)
2.某个函数声明了,但是没有定义
3.在多个文件组成的项目中,单独文件的编译没有问题,但是连接过程中出现偏差
大程序结构中尤其容易遗漏某些函数的定义

4.(在Dev中)运行程序时,上一次的程序仍然在运行,导致这次的运行被拒绝
这些自检能解决大部分萌新的问题,如果检查完后仍然出错,那么请自行百度。

6、stray ‘\xxx’ in program

这个问题一般是由全角字符引起的,注意错误所在行的字符中是否含有中文字符(包括空格)

这种错误经常出现在直接复制粘贴的代码中,因为别人的英文字符粘贴过来可能就变成中文的了

比如:

printf(%d\n”,3)//注意这行代码中的前后引号和分号都是中文字符的,所以报错

如果使用vscode编译器,现在这个分号中文的问题一般都会提示错误

7、“xxx” was not declared in this scope

xxx没有在这个范围内声明

可能是:

1.变量在这句代码前没定义
比如:

int a=2;    //没定义b
cout<<a+b;

2.函数没定义,或者在这句代码前未声明
没定义的情况就和变量没定义一样了,把函数写出来就好了

也有可能这个函数定义了,但是定义在这行代码后面,且未声明,比如:

#include <iostream>
using namespace std;
int main(){cout<<func(1);return 0;
}
int func(int a){return a+1;
}

建议:

1、可以把函数定义放在main之前

2、在main前面加上函数的声明,如:

#include <iostream>
using namespace std;
int func(int);      //加一句声明
int main(){cout<<func(1);return 0;
}
int func(int a){return a+1;
}

这里提一嘴,很多小伙伴会觉得这样写并不漂亮,但是实际上在写大程序结构的时候,有声明可以让用户更方便地看到这个函数是怎么用的,而不用看到繁荣复杂的函数代码内容,实际上很多程序员也是这样使用的,把声明单独拎到一个.h文件中,让main函数更加显眼。不过对于初学者,还是不推荐多写一个声明的,毕竟程序小而且多一个麻烦。

3 类在这句代码前未定义
如:

#include<iostream>
using namespace std;
int main(){myClass a;    //在这之前没有myClass的定义return 0;
}

4.等等
5 .使用库函数的时候忘记加相应的头文件了
比如使用printf函数而忘记加<stdio.h>头文件

6.忘记加using namespce std;
在没加using namespace std;时,使用的库函数的时候需要加上"std::"

比如:

#include<iostream>
int main(){cout<<0;     //这里应该改成std::cout<<0;return 0;
}

7.值得一提的是,在使用自定义变量/函数/类等的时候,可能因为大小写未区分而导致错误
这是由于C/C++语言是不支持大小写通用的

比如:

int Array[3]={0};
array[0]=1;      //这里定义和使用时的大小写不同

8、redefinition of ‘xxx’ 或者 redeclaration of ‘xxx’

重复定义或者重复声明,观察该变量/函数/类等等是否已经被定义/声明过了。

比如:

int a=0;
int a;    //又定义了一遍

9、expected “xxx” before “xxx”

缺少某部分东西了,最常见的是分号,比如:

int a=3    //这里末尾少了分号
int b=1;

也可能是把分号错打成其他符号,比如逗号,比如:

int i=0;
for(i=0,i<10;i++){cout<<i;}   //这里的for的条件中第一个分号打成逗号了

当然了,在多个{}的嵌套中,也常有漏写的情况,所以我们强调代码的整洁性,比如:

int i=0;
for(i=0;i<=10;i++){if(i%2==1){    //这里if的后括号缺失cout<<i;
}

总的来说,这种错误编译器是会给出提示的,照着提示改就行了

10、lvalue required as left(或right) operand of assignment

不正确的左值,左值不能为表达式,最常见的是以下情况:
1.条件语句的==写成
如:

int a=3;
if (a%2=1) cout<<"true";    //这里的条件运算符==错写成赋值运算符=
if (a%2==1) cout<<"true";   //改正后

2.试图给一个表达式赋值,如:

int a=3;
a*2=3;      //赋值语句的左边不能是表达式

3.试图给一个常数赋值,如:

int a=3;
4=a;       //不能给4赋值

11、cannot bind non-const lvalue reference of type ‘xxx’ to an rvalue of type ‘xxx’

给函数了一个不被函数允许的值

1.给引用一个表达式,如:

void func(int& a){a--;}
int b=3;
func(b*2);     //需要传入一个引用,但是表达式不能作为引用

2.给指针一个变量,如:

void func(int* a){a--;}
int b=3;
func(b);     //需要传入一个指针,但是却传入了一个变量

12、assignment of read-only variable ‘xxx’

给const赋值了,比如:

const int a=2;
a=3;          //a是常量,不能被赋值

13、uninitialized const ‘xxx’

没初始化,注意对常量定义时应当顺带初始化,比如:

const int a;       //没初始化
const int a=0;     //改正后

14、no matching function for call to ‘func(type)’

没有与type匹配的重载函数,一般是不使用函数要求的类型作为输入

比如:

#include<iostream>
#include<cmath>
using namespace std;
int main(){cout<<log("123");    //log函数要求输入值为double类型,但是给了一个数组return 0;
}

15、storage size of ‘xxx’ isn’t known

xxx的存储大小尚不清楚。在C/C++中,定义数组需要告诉编译器它的大小,如果没有告诉则会报错。

比如:

int a[];    //没有定义数组的大小

推荐的解决方式:

1.在定义时写上它的大小,如果实在不确定要多大可以给它一个很大的值
值得注意的是,在定义数组时应当对其初始化,否则数组的内容将是不确定的,比如:

int a[10000]={0};

2.如果已知数组的内容,可以直接在定义的时候给它赋值
比如:

int a[]={1,2,3,4,5};    //定义的时候赋值,这样它的大小也确定了

3.在方法1中,可能存在数组占用太多内存的问题,对电脑是一个负担,因此我们建议使用vector
vector类的使用时需要加头文件,这是一个STL(标准模板库),即前辈为我们写好的,并且经过时间检验是实用的东西

这里举一些vector使用的例子

#include <vector>
#include <iostream>
using namespace std;
int main(){vector<int> a;    //定义一个int类型的容器a.push_back(3);     //往a的末尾放一个数值3a.push_back(4);a[0]=4;          //更改a的特定位置的值int len=a.length()   //获得a的长度a.erase(a.begin()+1);     //删除a[1]a.pop_back();      //删除a的最后一个值
}

当然vector还有其他丰富的库函数,如有需要可自行百度,这里就不全部列举了

此外,不建议大家在竞赛中使用vector,这些库函数可能会拖慢运行速度,在竞赛中最好先计算好可能需要的数组大小,再按照方法1进行定义

16、declaration of ‘xxx’ as multidimensional array must have bounds for all dimensions except the first

声明“xxx”为多维数组必须对除第一个维度外的所有维度都有边界

这是在定义多维数组的时候常出现的问题,如:

int a[][];       //两个维度都没有给出边界
int a[10][];     //后一个维度没有给出边界

多维数组的第一个维度可以不定义数量,但是其他必须定义数量,建议改为:

int a[][10];      //第一个维度可以没有数量,但其他维度必须有数量

17、expected primary-expression before ‘xxx’ token

在xxx前期望有主表达式
这个xxx最常见的是’)',一般是括号内的表达式与要求的不符,比如在if语句的括号内加了分号

18、size of array ‘xxx’ has non-integral type ‘xxx’

数组的大小为错误类型,这是在定义数组的时候,数组的大小用的不是整数

比如:

int a[1.2]={0};
int a["123"]={0};

19、invalid types ‘xxx’ for array subscript

数组的下标无效

1.和上一个类型很像,只不过是在调用数组的时候犯的
比如:

int a[5]={0};
cout<<a[1.2];     //尝试输出下标为1.2的数,然而下标只能是整数
cout<<a["123"];   //尝试输出下标为"123"的数,编译器感到疑惑

2.还有一种可能是,你明明说它不是数组,却把它当数组来使用
比如:

int a=0;
cout<<a[2];     //a是整型,却当数组来用了

20、conflicting declaration ‘xxx’

对某个东西的冲突说明,比如你定义的变量类型,与你之前说明的不一样

1.既是变量,又是数组(或指针,或引用)

int a=0;
int a[5]={0};     //既说a是整型,又说它是数组,冲突说明了

2.有对它的不同类型的定义(声明)

int a=0;
double a=0;    //既说它是整型,又说是双精度实数

21、invalid conversion from ‘xxx’ to ‘xxx’ [-fpermissive]

从一个类型向另一个类型转化时发生错误

一些编译器,当发现函数等要求的类型与你给的类型不一样时,会尝试自动进行转化,当它发现自己也不能转化时,就会报错。

1.自己写的函数,却有错误的输入
比如:

int func(int a){a++;}
func("123");

2.试图给表达式读入数据
比如:

int a=0;
cin>>a+1;

22、‘xxx’ does not name a type

没有说明变量的类型,通常在const后面忘加变量类型了,比如:

const a=0;     //没有说明a的类型

23、cannot convert ‘xxx’ to ‘xxx’

不能把xxx类型的参数改变为xxx类型

这种情况一般是变量赋值的时候,给这个变量赋了一个不属于它的类型的值,比如:

double a=0;
int* p=&a;     //a的地址是double*类型的

24、lvalue required as unary ‘&’ operand

左值需要作为一元的“&”操作数

可能是对一个表达式或者一个常数取地址了,比如:

int a=1;
int* p1=&(a+1);    //对表达式取地址
int* p2=&2//对常数取地址

25、cannot bind non-const lvalue reference of type ‘xxx&’ to an rvalue of type ‘xxx’

不能将类型为’xxx&'的非常量左值引用绑定到类型为’xxx’的右值

给引用绑定了一个表达式或者一个常数,比如:

int& p1=a+1;      //对表达式引用
int& p2=2//对常数引用

26、Unable to start debugging. Program path ‘xxx.exe’is missing or invalid.GDB failed with message:…/Unable to start debugging.Unexpected GDB output from command … :Invalid argument

这个其实有很多情况,根据message后面的提示可以知道具体出了什么问题

但是我这里要强调的是一种message:No such file or directory.VScode的编译器要求路径不能有中文。通俗的来讲就是你的文件名,以及文件所在的文件夹名、文件夹所在的上一级文件夹名一直到某个盘,都不能有中文。最高效的方法就是检查‘xxx.exe’的内容(一般是一长串)是否有中文。此外还要注意检查是否有中文字符,比如中文的"(“、”。"等等。注意看,这个报错框中我的代码文件“1.cpp”的路径“D:\desktop\新建文件夹”中“新建文件夹”为中文名,因此报错。

在这里插入图片描述
注意看,这个报错框中我的代码文件“1.cpp”的路径“D:\desktop\新建文件夹”中“新建文件夹”为中文名,因此报错
如果检查发现没问题,就去网上查查吧,笔者看到这个报错提示的时候也只遇到过上述的情况。(如果有读者能发现其他问题,并且提供给作者,那就更好了(>__<)

27、named return values are no longer supported

在写函数的时候,沿用if和for结构的习惯不加大括号,但是函数是要求加的。

如:

int cube(int a) return a*a*a;

正确的写法应该是:

int cube(int a){return a*a*a;}    //大括号是不可省略的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/206889.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宝塔面板安装搭建DiscuzQ论坛教程与小程序上架发布后的展示效果

DiscuzQ论坛小程序上架发布后的展示效果&#xff1a; 1、需要用到的环境&#xff1a; php7.2 mysql5.7或者MariaDB 10.2(我安装用的mysql8.0) php除了必要的一些扩展外&#xff0c;还需要启用readlink、symlink函数等&#xff0c;具体看官方说明&#xff0c;安装的时候也会提醒…

【鸿蒙应用ArkTS开发系列】- 云开发入门实战二 实现省市地区三级联动地址选择器组件(上)

目录 概述 云数据库开发 一、创建云数据库的对象类型。 二、预置数据&#xff08;为对象类型添加数据条目&#xff09;。 三、部署云数据库 云函数实现业务逻辑 一、创建云函数 二、云函数目录讲解 三、创建resources目录 四、获取云端凭据 五、导出之前创建的元数据…

【Vue】@keyup.enter @v-model.trim的用法

目录 keyup.enter v-model.trim 情景一&#xff1a; 情景二&#xff1a; keyup.enter 作用&#xff1a;监听键盘回车事件 上一篇内容&#xff1a; 记事本 https://blog.csdn.net/m0_67930426/article/details/134630834?spm1001.2014.3001.5502 这里有个添加任务的功能&…

使用opencv实现图像滤波

1 图像滤波介绍 滤波是信号和图像处理中的基本任务之一&#xff0c;其旨在有选择地提取图像的某些特征&#xff0c;可以用于在给定应用程序的上下文中传达重要信息&#xff0c;例如&#xff0c;去除图像中的噪声、提取所需的视觉特征、图像重采样等。 1.1 图像滤波理论 图像…

R语言实现Lasso回归

一、Lasso回归 Lasso 回归&#xff08;Least Absolute Shrinkage and Selection Operator Regression&#xff09;是一种用于线性回归和特征选择的统计方法。它在回归问题中加入了L1正则化项&#xff0c;有助于解决多重共线性&#xff08;多个特征高度相关&#xff09;和特征选…

C语言——写一个简单函数,找两个数中最大者

#include <stdio.h>int max( int a, int b ) { return a>b ? a:b; }int main() { int a, b;printf("输入两个数:\n");scanf("%d %d", &a, &b);printf("max %d\n", max(a, b));return 0; }输出结果&#xff1a;

C#文件基本操作(判断文件是否存在、创建文件、复制或移动文件、删除文件以及获取文件基本信息)

目录 一、判断文件是否存在 1.File类的Exists()方法 2.FileInfo类的Exists属性 二、创建文件 1.File类的Create()方法 2.FileInfo类的Create()方法 三、复制或移动文件 1.File类的Copy()方法 2.File类的Move()方法 3.FileInfo类的CopyTo()方法 四、删除文件 1.File…

大数据基础设施搭建 - Hive

文章目录 一、上传压缩包二、解压压缩包三、配置环境变量四、初始化元数据库4.1 配置MySQL地址4.2 拷贝MySQL驱动4.3 初始化元数据库4.3.1 创建数据库4.3.2 初始化元数据库 五、启动元数据服务metastore5.1 修改配置文件5.2 启动/关闭metastore服务 六、启动hiveserver2服务6.1…

MacOS + Android Studio 通过 USB 数据线真机调试

环境&#xff1a;Apple M1 MacOS Sonoma 14.1.1 软件&#xff1a;Android Studio Giraffe | 2022.3.1 Patch 3 设备&#xff1a;小米10 Android 13 一、创建测试项目 安卓 HelloWorld 项目: 安卓 HelloWorld 项目 二、数据线连接手机 1. 手机开启开发者模式 参考&#xff1…

FFmpeg之将视频转为16:9(横屏)或9:16(竖屏)(一)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

代码随想录算法训练营第一天 | 704. 二分查找 27. 移除元素

class Solution { public:int search(vector<int>& nums, int target) {int l0;int rnums.size()-1;while(l<r){int mid(lr)>>1;if(targetnums[mid]) return mid;if(target>nums[mid]){lmid1;}else{rmid-1;}}return -1;} }; 之前就已经熟悉二分法了&am…

【HuggingFace Transformer库学习笔记】基础组件学习:pipeline

一、Transformer基础知识 pip install transformers datasets evaluate peft accelerate gradio optimum sentencepiece pip install jupyterlab scikit-learn pandas matplotlib tensorboard nltk rouge在host文件里添加途中信息&#xff0c;可以避免运行代码下载模型时候报错…

计算机网络(二)

&#xff08;八&#xff09;客户端软件设计的细节 A、解析协议号 客户端可能会需要通过协议名指定协议&#xff0c;但是Socket接口是用协议号指定的&#xff0c;这时候我们就需要使用getprotobyname()函数实现协议名到协议号的转换&#xff0c;该函数会返回一个指向protoent的…

西南科技大学电路分析基础实验A1(元件伏安特性测试 )

目录 一、实验目的 二、实验设备 三、预习内容(如:基本原理、电路图、计算值等) 1、测定线性电阻的伏安特性 2、二极管伏安特性测试 3、测定实际电压源的伏安特性 四、实验数据及结果分析(预习写必要实验步骤和表格) 1、测定线性电阻的伏安特性 2、二极管伏安特性测…

Redis未授权访问-CNVD-2019-21763复现

Redis未授权访问-CNVD-2019-21763复现 利用项目&#xff1a; https://github.com/vulhub/redis-rogue-getshell 解压后先进入到 RedisModulesSDK目录里面的exp目录下&#xff0c;make编译一下才会产生exp.so文件&#xff0c;后面再利用这个exp.so文件进行远程代码执行 需要p…

能耗远程在线监测系统在工业节能提高效率

摘要&#xff1a;为保证企业实现节能减排目标&#xff0c;设计和使用远程在线监测系统势在必行。远程在线监测系统是基于传感器与网络技术的优势&#xff0c;在企业区域各个位置针对性安装传感器&#xff0c;对实时数据进行采集、编码传输到远程管理系统。远程管理系统对采集的…

系统设计面试指南之分布式任务调度

1 简介 任务是需要资源(CPU 时间、内存、存储、网络带宽等)在指定时间内完成的一段计算工作。 通过智能地将资源分配给任务以满足任务级和系统级目标的系统称为任务调度程序。 任务调度程序&#xff1a; 及时决定和分配资源给任务的过程称为任务调度。 当我们在 Facebook 发…

【EasyExcel】导出excel并支持自定义设置数据行背景颜色等

需求背景&#xff1a; 根据查询条件将列表数据导出&#xff0c;并筛选出满足某个条件的数据&#xff0c;将满足条件的数据的背景颜色设置成黄色。 &#xff08;本文例子如&#xff1a;name出现的次数大于等于2&#xff0c;将相关数据背景颜色都设置为黄色&#xff09; …

MySQL备份与恢复(重点)

MySQL备份与恢复&#xff08;重点&#xff09; 一、用户管理与权限管理 ☆ 用户管理 1、创建MySQL用户 注意&#xff1a;MySQL中不能单纯通过用户名来说明用户&#xff0c;必须要加上主机。如jack10.1.1.1 基本语法&#xff1a; mysql> create user 用户名被允许连接的主…

java springboot测试类虚拟MVC环境 匹配返回值与预期内容是否相同 (JSON数据格式) 版

上文java springboot测试类鉴定虚拟MVC请求 返回内容与预期值是否相同我们讲了测试类中 虚拟MVC发送请求 匹配返回内容是否与预期值相同 但是 让我意外的是 既然没人骂我 因为我们实际开发 返回的基本都是json数据 字符串的接口场景是少数的 我们在java文件目录下创建一个 dom…