1 #include <stdio.h> 2 #include "stdlib.h" 3 4 #define LIST_INIT_SIZE 100 5 #define LISTINCREMENT 10 6 7 typedef int ElemType; 8 9 typedef struct 10 { 11 ElemType elem[LIST_INIT_SIZE]; 12 int length; 13 int listsize; 14 }SqList; 15 16 class Sq 17 { 18 public: 19 SqList sqList; 20 21 Sq(); 22 ElemType getElem(int i); 23 bool listInsert(int i, ElemType e); 24 bool listDelete(int i, ElemType &e); 25 }; 26 27 Sq::Sq() 28 { 29 this->sqList.length = 0; 30 this->sqList.listsize = LIST_INIT_SIZE; 31 } 32 33 ElemType Sq::getElem(int i) 34 { 35 if (i<1 || i>sqList.length) return ElemType(); 36 37 ElemType elem = sqList.elem[i - 1]; 38 39 return elem; 40 } 41 42 bool Sq::listInsert(int i, ElemType e) 43 { 44 if (i<1 || i>sqList.length + 1) return false; 45 46 for (int j = sqList.length - 1; j >= i; j++) 47 { 48 sqList.elem[j + 1] = sqList.elem[j]; 49 } 50 51 if(i==101) 52 { 53 printf("%d\n",sqList.length);//100 54 } 55 sqList.elem[i - 1] = e; 56 if(i==101) 57 { 58 printf("%d\n",sqList.length);//101 59 } 60 ++sqList.length; 61 if(i==101) 62 { 63 printf("%d\n",sqList.length);//102 64 } 65 return true; 66 } 67 68 int main() 69 { 70 Sq sq; 71 for (int i = 1; i <= 102; i++) 72 { 73 sq.listInsert(i, i); 74 } 75 76 return 0; 77 }
当i==10时,sq.listInsert(int,int)方法中,插入之后length自动+1???执行自动操作后又自动+1。
1 //修改main方法 2 int main() 3 { 4 Sq sq; 5 for (int i = 1; i <= 102; i++) 6 { 7 int e = 0; 8 e = i; 9 if (i == 101) 10 { 11 printf("%d", sq.sqList.length); 12 e = 200; 13 } 14 sq.listInsert(i, e);//55行执行后,sqList.length会变成200。 15 } 16 17 return 0; 18 }
当数据超出数组长度,会把超出的值覆盖结构体里其他变量的值,当其它变量也都占据之后,再继续添加就出抛溢出错误。代码见评论。
为啥必须悬赏才能关闭问题😥
原来是这样,结构体中的数组原来是这样。
#include <stdio.h> typedef struct { int elem[2]; }SqList; int main() { /* 我的第一个 C 程序 */ printf("Hello, World! \n"); SqList sl; printf("%d\n",sizeof(sl)); for(int i=0;i<6;i++) { sl.elem[i]=i; printf("%d ",sizeof(i)); printf("%d\n",sl.elem[i]); } return 0; } /* Hello, World! 8 4 0 4 1 4 2 4 3 4 4 4 5 */
这就有点过分了。。。
使用https://c.runoob.com/compile/12可以正常打印结果没有error,使用vs程序执行结束会报错。
有意思,你把数组长度增大,增到1000。你定义的是100,可是你for循环到了101 ,应该会报溢出的错误,可是却出现了乱七八糟的结果。
嗯嗯,因为它之前没溢出,后来研究为啥没溢出的时候,后来就又碰到这个诡异的问题了。
1 //修改代码如下: 2 bool Sq::listInsert(int i, ElemType e) 3 { 4 if (i<1 || i>sqList.length + 1) return false; 5 6 for (int j = sqList.length - 1; j >= i; j++) 7 { 8 sqList.elem[j + 1] = sqList.elem[j]; 9 } 10 11 if(i==101||i==102) 12 { 13 printf("length:%d\n",sqList.length); 14 printf("size:%d\n",sqList.listsize); 15 } 16 sqList.elem[i - 1] = e; 17 if(i==101||i==102) 18 { 19 printf("length:%d\n",sqList.length); 20 printf("size:%d\n",sqList.listsize); 21 } 22 23 ++sqList.length; 24 if(i==101||i==102) 25 { 26 printf("length:%d\n",sqList.length); 27 printf("size:%d\n",sqList.listsize); 28 } 29 return true; 30 } 31 32 int main() 33 { 34 Sq sq; 35 for (int i = 1; i <= 102; i++) 36 { 37 int e = 0; 38 e = i; 39 if (i == 101||i==102) 40 { 41 printf("%d\n",i); 42 e=101; 43 } 44 sq.listInsert(i, e); 45 } 46 47 return 0; 48 } 49 //打印结果: 50 /* 51 101 52 length:100 53 size:100 54 length:101 55 size:100 56 length:102 57 size:100 58 102 59 length:102 60 size:100 61 length:102 62 size:101 63 length:103 64 size:101 65 */ 66 /*结论:当数据超出数组长度,会把超出的值覆盖结构体里其他变量的值,当其它变量也都占据之后,再继续添加就出抛溢出错误了。*/
你问题是什么?
– Shendu.cc 6年前@Shendu.cc: 53行和58行打印出来的值应该相同,即都是100。sqList.length没有自增操作,58行却打印出101,不符合正常的逻辑。
– junlu 6年前