1.

for(int i=0;i<sizeof(res)/sizeof(res[0]);i++){
  cout<<res[i]<<endl;
}

报错:comparison of integer expressions of different signedness: 'int' and 'long long unsigned int' [-Wsign-compare]

意思大致是int类型的无符号与有符号类型不能比较:sizeof()返回的值是无符号类型的,而int是有符号类型的:当两者比较时i会转变为一个无符号数计算,有发生溢出的风险。

在比较时编译器自动进行的转换:

有符号与无符号比较:有符号数会转换成无符号数来进行比较(如int 与 unsigned int 比较,int 转换成 unsigned int)。

有符号与非无符号数比较:非无符号转化成有符号(如int 与 unsigned char比较,unsigned char 转换成 int)。

无符号与非有符号数比较:非有符号转化成有符号(如unsigned int 与 char比较,char 转换成 unsigned int)。

 解决方法:

1.把无符号数转变为有符号数,可使用强制类型转换,在sizeof()前加(int);

2.把有符号数转变为无符号数,可以在定义时把int i换成unsigned int i;

2.

报错:warning: unused variable ‘x’ [-Wunused-variable]

意思是定义的变量未使用

解决方法:

1. 该变量定义了不使用留着干嘛!果断直接删掉

2.在变量前加(void)比如:int x;//定义变量x,(void)x;//瞒过编译器

3.

报错:==42==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000001e0 at pc 0x00000034be3a bp 0x7ffd608eb800 sp 0x7ffd608eb7f8

后面一大堆报错代码我就不复制粘贴了,总而言之就是数组下标越界,以下是报错代码

while(index<nums.size()){
  while(nums[index]==1&&index<nums.size()){//错误点
    calculate++;
    index++;
  }  
  if(calculate>conclusion){
    conclusion=calculate;
  }                                                                                
  calculate=0;
  if(nums[index]!=1&&index<nums.size()){//错误点
    index++;
  }                                                                                
}

在看到报错代码后,我也知道要加一个判断条件防止下标越界,就加在了数组操作的后面,结果还是报错,后来加到前面后才解决:

while(index<nums.size()){
  while(index<nums.size()&&nums[index]==1){//先判断下标是否越界,再对数组元素进行操作
    calculate++;
    index++;
  }  
  if(calculate>conclusion){
    conclusion=calculate;
  }                                                                                
  calculate=0;
  if(index<nums.size()&&nums[index]!=1){//先判断下标是否越界,再对数组元素进行操作
    index++;
  }                                                                                
}

原因:

编译器根据运算先后顺序读取,对于&&运算符两边条件,编译器从左向右读取,若左边条件不满足,则直接false,不会向后读取,

当数组越界时会直接报错,不会再读取后面的判断条件,所以必须先加判断条件,再对数组进行操作

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐