C语言中数组指针发生的那些莫名错误
数组指针:char (*p) [size]
不同编译器或者有时会受野指针的影响,编译的结果都会与我们预期的结果不一致。以下内容均为本人亲身编译经历,分享出来初衷只是抛砖引玉,望各位大佬指正。
1.心路历程一
char (*p1) [];
char (*p2) [];
char ch3 [] = "sgl";
char ch4 []= "2020ahka";
p1 = &ch3;
p2 = &ch4;
printf("%s\n", (char*)p1);
printf("%s\n", (char*)p2);
-当我们没有指定字符串数组指针时,根据不同编译器,打印(char*)p1时有时会是:“sql2020ahka”,没错它自动把ch3和ch4自动拼接在了一起;当时就懵逼了很久,但是第二天我过来重新尝试它又能正常打印。我???????
2 .心路历程二
char (*p1) [];
char (*p2) [];
char ch3 [5] = "sgl";
char ch4 [20]= "2020ahka";
p1 = &ch3;
p2 = &ch4;
printf("%s\n", (char*)p1);
printf("%s\n", (char*)p2);
- 我们定义一个数组指针时一般都不会指定它的大小,毕竟我们指向的数组大小还未确定,但是当我们确定了指向的数组大小时一定记得回来给p1和p2指定大小,不然有时就会发生莫名其妙的错误。
- 当然这里定义的p1和p2大小还有些讲究,比如当你定义p为p[6]或者p[4]时(比你指向的数组大或者小),编译器就会给你警告,它不会报错,极大概率它能打印出你预期的正确结果,不过有时它就会给你一个惊喜!!
- 所以我们在定义时严谨些让它与它的指向的数组大小一致;严谨代码如下:
char (*p1) [5];
char (*p2) [20];
char ch3 [5] = "sgl";
char ch4 [20]= "2020ahka";
p1 = &ch3;
p2 = &ch4;
printf("%s\n", (char*)p1);
printf("%s\n", (char*)p2);
最后,我想提醒各位跟我一样刚进阶c语言的萌新们,不要忽视编译器的警告,c语言它不会有太严格的规范,c中的警告在其他语言就是error.。