C语言中数组指针发生的那些莫名错误应该如何避免

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.。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言数组指针指针数组是两种不同的概念。下面我将为您提供一些代码例子来说明它们之间的区别。 1. 指针数组示例: ```c #include <stdio.h> int main() { int a = 10, b = 20, c = 30; int *arr[3]; // 声明一个指针数组 arr[0] = &a; // 数组的第一个元素指向变量a arr[1] = &b; // 数组的第二个元素指向变量b arr[2] = &c; // 数组的第三个元素指向变量c for (int i = 0; i < 3; i++) { printf("arr[%d] = %d\n", i, *arr[i]); // 打印数组元素的值 } return 0; } ``` 输出结果: ``` arr[0] = 10 arr[1] = 20 arr[2] = 30 ``` 在上述代码,我们声明了一个指针数组`arr`,其的每个元素都是一个指向`int`类型的指针。然后,我们将变量`a`、`b`和`c`的地址分别赋给了数组的元素。最后,通过循环遍历数组,并使用解引用操作符`*`来获取数组元素所指向的值。 2. 数组指针示例: ```c #include <stdio.h> int main() { int arr[3] = {10, 20, 30}; int (*ptr)[3]; // 声明一个数组指针 ptr = &arr; // 数组指针指向数组arr的地址 for (int i = 0; i < 3; i++) { printf("(*ptr)[%d] = %d\n", i, (*ptr)[i]); // 通过数组指针访问数组元素的值 } return 0; } ``` 输出结果: ``` (*ptr)[0] = 10 (*ptr)[1] = 20 (*ptr)[2] = 30 ``` 在上述代码,我们声明了一个数组`arr`,并初始化了它的元素。然后,我们声明了一个数组指针`ptr`,并将数组`arr`的地址赋给了它。通过在指针前加上括号,我们可以使用解引用操作符`*`来访问数组元素的值。 总结来说,指针数组是一个数组,其的每个元素都是指针,而数组指针是一个指向数组指针。它们在使用方法和语义上有所区别。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值