C语言之通过数组访问地址的鬼才操作(部分错误操作)

数组下标越界访问却不报错,正常运行??

//初始化定义程序:
void main(void)
{
	unsigned char code[4]=0;
	unsigned char code_1[4]=0; //两句等于unsigned char buf[8]=0;
}
//程序调用端
code[0]=num%10;			
code[1]=num/10%10;		
code[2]=num/100%10;	
code[3]=num/1000%10;		
code[4]=fre%10;			
code[5]=fre/10%10;		
code[6]=fre/100%10;		
code[7]=fre/1000%10;							

运行平台:51单片机+keil5
现象描述:使用buf[]可以访问到code_1的数组内容。

原因分析:

  1. 因为,分开连续定义两个4个8位char型内存,但是类型一样,于是cpu可以读取连续数组无误。在内存层面,调用数组内存是没有数组名字,buf[7]就是读buf[0]地址偏移7位的地址,地址类型都一样,所以写入和读取正常,没有非法访问现象。
  2. 另外一个原因就是51的gcc编译器检错能力比较有限。

二维数组

int main ()
{
	int a[3][4] = {{1,2}, {0}, {4, 6, 8, 10}};
	printf("输出结果为:%d\n", a[1][2]);
	printf("输出结果为:%d\n", a[1][0]);
	printf("输出结果为:%d\n", a[1][1]);
	printf("输出结果为:%d\n", a[1][3]);
	printf("输出结果为:%d\n", a[0][3]);
	printf("输出结果为:%d\n", a[0][2]);
	return 0;
}

输出结果都为0

多维数组

int main ()
{
	int a[3][4][3] = {{{1,2}}, {{1}}, {4, 6, 8}};
	printf("输出结果为:%d\n", a[1][0][0]);
	printf("输出结果为:%d\n", a[5]);


    return 0;
    }
#include <stdio.h>

int main ()
{
        int a3d[2][2][3] =    { { { 1, 0, 0 }, { 4, 0, 0 } },
                      { { 7, 8, 0 }, { 1, 2, 3 } } };
		
		int (*p)[2][3] = a3d;
        printf("输出结果为:%d\n",*(*(*(p+1)+1)+1) );
	return 0;
}

输出结果为:2

*(p+1) 代表当前a[0][0][0]加到a[1][0][0]
*
http://c.biancheng.net/view/2022.html

单个++访问也可

	int a[2][2][3] = {1,2,3,4};
	int *p = &(a[0][0][0]);
	//
	
	/* for(int i = 0; i < 2*2*3; i++)
		*(p+i) = i; */
	
	printf("a[][][]的值为:%d\n", *(p+(0*3 + 0*3 + 1)));
	
	printf("===============\n");
	for(int i = 0; i < 2*2*3; i++)
	printf("a[][][]的值为:%d\n", *(p+i)); 
	

//编译提示warning,错误写法

	int a[2][2][3] = {1,2,3,4};
	int *p = a;
	printf("a[][][]的值为:%d\n", *(p+(0*3 + 0*3 + 1)));
	
	printf("===============\n");
	for(int i = 0; i < 2*2*3; i++)
	printf("a[][][]的值为:%d\n", *(p+i)); 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值