邯郸哪儿做网站便宜,四川教育公共信息服务平台,合肥哪家网站公司好,如何打开网页我们无论是在学习中还是在工作当中#xff0c;总是会遇到各种各样的c编译错误问题#xff0c;经常会有一种情况就是上一次好像遇到过这种问题#xff0c;但是就是想不起来了#xff08;我就是这样#xff09;所以下面这一篇文章就是总结自己遇到的编译以及运行错误。
注意…我们无论是在学习中还是在工作当中总是会遇到各种各样的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是没有对象的野指针
*p3; //对野指针所指区域赋值建议改成malloc需要加stdlib.h头文件C中直接用new
int* p(int*)malloc(sizeof(int)); //malloc函数返回类型是void*需要强制类型转化一下
int* pnew int;2.2 指针并不是野指针但是它指向NULL或者指向受系统保护的区域
比如以下两种情况
int* p0
int* pNULL;建议和2.1一样分配一块动态内存
另外注意的是scanf忘记加也会因为这个原因报Segmentation fault
如
int a0;
scanf(%d,a); //忘加2.3 下标越界访问某个数组超出其定义下标的值
比如
int array[3]{0}; //只定义到3
coutarray[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)); //输出-inf4、no match for ‘xxx’ (operand types are ‘xxx’ and ‘xxx’)
没有与这些操作数匹配的xx操作符
操作符指的是一些运算符比如、-、、、[]等
操作数是这些运算符所需要操作的对象比如运算需要有左右两个数而运算是对一个数操作的
出现这个错误一般是操作数的类型与操作符所要求的不匹配比如string类型需要头文件
4.1 使用系统的类时出错或者尝试对不正确的类型进行运算符操作
比如
string aabc;
cout3a; //将一个整数与一个string类型的变量相加这是运算不允许的特别提一下如果你的报错的对象是“、”请检查你的使用是否规范惨痛的教训比如
cina; //正确的应为cina;
cout3; //正确的应为cout3;4.2 在使用自己定义的类时尝试使用系统默认的运算符
比如
class Integer{
public:int a;Integer(int aa):a(aa){}
};
Integer a(1),b(2);
coutab; //因为系统的运算没有对自定义的类的运算方法建议
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.ib.i)); }
Integer a(1),b(2);
Integer cab;
coutc.a; 2.访问类中的变量对类中变量单独进行运算如
couta.ab.a;5、launchprogram “xxx” does not exist 或者 ld returned 1 exit statusin 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 a2; //没定义b
coutab;2.函数没定义或者在这句代码前未声明 没定义的情况就和变量没定义一样了把函数写出来就好了
也有可能这个函数定义了但是定义在这行代码后面且未声明比如
#include iostream
using namespace std;
int main(){coutfunc(1);return 0;
}
int func(int a){return a1;
}建议
1、可以把函数定义放在main之前
2、在main前面加上函数的声明如
#include iostream
using namespace std;
int func(int); //加一句声明
int main(){coutfunc(1);return 0;
}
int func(int a){return a1;
}这里提一嘴很多小伙伴会觉得这样写并不漂亮但是实际上在写大程序结构的时候有声明可以让用户更方便地看到这个函数是怎么用的而不用看到繁荣复杂的函数代码内容实际上很多程序员也是这样使用的把声明单独拎到一个.h文件中让main函数更加显眼。不过对于初学者还是不推荐多写一个声明的毕竟程序小而且多一个麻烦。
3 类在这句代码前未定义 如
#includeiostream
using namespace std;
int main(){myClass a; //在这之前没有myClass的定义return 0;
}4.等等 5 .使用库函数的时候忘记加相应的头文件了 比如使用printf函数而忘记加stdio.h头文件
6.忘记加using namespce std; 在没加using namespace std;时使用的库函数的时候需要加上std::
比如
#includeiostream
int main(){cout0; //这里应该改成std::cout0;return 0;
}7.值得一提的是在使用自定义变量/函数/类等的时候可能因为大小写未区分而导致错误 这是由于C/C语言是不支持大小写通用的
比如
int Array[3]{0};
array[0]1; //这里定义和使用时的大小写不同8、redefinition of ‘xxx’ 或者 redeclaration of ‘xxx’
重复定义或者重复声明观察该变量/函数/类等等是否已经被定义/声明过了。
比如
int a0;
int a; //又定义了一遍9、expected “xxx” before “xxx”
缺少某部分东西了最常见的是分号比如
int a3 //这里末尾少了分号
int b1;也可能是把分号错打成其他符号比如逗号比如
int i0;
for(i0,i10;i){couti;} //这里的for的条件中第一个分号打成逗号了当然了在多个{}的嵌套中也常有漏写的情况所以我们强调代码的整洁性比如
int i0;
for(i0;i10;i){if(i%21){ //这里if的后括号缺失couti;
}总的来说这种错误编译器是会给出提示的照着提示改就行了
10、lvalue required as left或right operand of assignment
不正确的左值左值不能为表达式最常见的是以下情况 1.条件语句的写成 如
int a3;
if (a%21) couttrue; //这里的条件运算符错写成赋值运算符if (a%21) couttrue; //改正后2.试图给一个表达式赋值如
int a3;
a*23; //赋值语句的左边不能是表达式3.试图给一个常数赋值如
int a3;
4a; //不能给4赋值11、cannot bind non-const lvalue reference of type ‘xxx’ to an rvalue of type ‘xxx’
给函数了一个不被函数允许的值
1.给引用一个表达式如
void func(int a){a--;}
int b3;
func(b*2); //需要传入一个引用但是表达式不能作为引用2.给指针一个变量如
void func(int* a){a--;}
int b3;
func(b); //需要传入一个指针但是却传入了一个变量12、assignment of read-only variable ‘xxx’
给const赋值了比如
const int a2;
a3; //a是常量不能被赋值13、uninitialized const ‘xxx’
没初始化注意对常量定义时应当顺带初始化比如
const int a; //没初始化
const int a0; //改正后14、no matching function for call to ‘func(type)’
没有与type匹配的重载函数一般是不使用函数要求的类型作为输入
比如
#includeiostream
#includecmath
using namespace std;
int main(){coutlog(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(){vectorint a; //定义一个int类型的容器a.push_back(3); //往a的末尾放一个数值3a.push_back(4);a[0]4; //更改a的特定位置的值int lena.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};
couta[1.2]; //尝试输出下标为1.2的数然而下标只能是整数
couta[123]; //尝试输出下标为123的数编译器感到疑惑2.还有一种可能是你明明说它不是数组却把它当数组来使用 比如
int a0;
couta[2]; //a是整型却当数组来用了20、conflicting declaration ‘xxx’
对某个东西的冲突说明比如你定义的变量类型与你之前说明的不一样
1.既是变量又是数组或指针或引用
int a0;
int a[5]{0}; //既说a是整型又说它是数组冲突说明了2.有对它的不同类型的定义声明
int a0;
double a0; //既说它是整型又说是双精度实数21、invalid conversion from ‘xxx’ to ‘xxx’ [-fpermissive]
从一个类型向另一个类型转化时发生错误
一些编译器当发现函数等要求的类型与你给的类型不一样时会尝试自动进行转化当它发现自己也不能转化时就会报错。
1.自己写的函数却有错误的输入 比如
int func(int a){a;}
func(123);2.试图给表达式读入数据 比如
int a0;
cina1;22、‘xxx’ does not name a type
没有说明变量的类型通常在const后面忘加变量类型了比如
const a0; //没有说明a的类型23、cannot convert ‘xxx’ to ‘xxx’
不能把xxx类型的参数改变为xxx类型
这种情况一般是变量赋值的时候给这个变量赋了一个不属于它的类型的值比如
double a0;
int* pa; //a的地址是double*类型的24、lvalue required as unary ‘’ operand
左值需要作为一元的“”操作数
可能是对一个表达式或者一个常数取地址了比如
int a1;
int* p1(a1); //对表达式取地址
int* p22 //对常数取地址25、cannot bind non-const lvalue reference of type ‘xxx’ to an rvalue of type ‘xxx’
不能将类型为’xxx的非常量左值引用绑定到类型为’xxx’的右值
给引用绑定了一个表达式或者一个常数比如
int p1a1; //对表达式引用
int p22 //对常数引用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后面的提示可以知道具体出了什么问题
但是我这里要强调的是一种messageNo 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;} //大括号是不可省略的