【】数组名传递数组的长度,容易产生数组越界越界

数组名转换为指针作为参数

当数组名作为参数传递时,需要传递数组的长度。因为,数组名作为参数传递后,转换为指针。此时无法通过关键字获取数组的长度。那么在对数据进行操作时c定义数组,就无法正确判断数组的长度,很容易造成数组越界。

一个程序测试的例子如下:

图片[1]-【】数组名传递数组的长度,容易产生数组越界越界-4747i站长资讯

运行程序的结果如下:

可以看到,定义了字符串数组a[18],字符数组的长度为18字节。所以,在main()函数中,使用操作符获取变量a占用的内存容量,得到18个字节。

但是,当将字符数组变量a[]传递给func()函数时,字符数组变量a会将其地址传递给形参变量a1,此时形参变量a1就相当于一个指针。

图片[2]-【】数组名传递数组的长度,容易产生数组越界越界-4747i站长资讯

那么,在func()函数中,通过运算符得到的形参变量a1占用的内存空间大小是4字节而不是18字节。

因为c定义数组,形参变量 a1 是指针,而不是字符数组。

为什么会这样?

这是编译器优化的结果,我们看下面的例子:

字符 a[512*512];

函数(一);

此时,定义一个字符数组 a 会占用大量内存空间。然后,将字符数组 a 作为实参数传递给 func() 函数。此时,形参变量a1被用作“局部变量”,内存空间将被分配到函数的“栈”上。形参变量a1的容量太大。会导致函数的“堆栈溢出”。

因此,编译器避免在参数中传递大量数据。当参数为数组时,只传递数组名所代表的首地址。因此,数组名称被转换为指针,传递一个指针。

文章来源:http://baijiahao.baidu.com/s?id=1704892909121026747&wfr=spider&for=pc

------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享