数组名转换为指针作为参数
当数组名作为参数传递时,需要传递数组的长度。因为,数组名作为参数传递后,转换为指针。此时无法通过关键字获取数组的长度。那么在对数据进行操作时c定义数组,就无法正确判断数组的长度,很容易造成数组越界。
一个程序测试的例子如下:
运行程序的结果如下:
可以看到,定义了字符串数组a[18],字符数组的长度为18字节。所以,在main()函数中,使用操作符获取变量a占用的内存容量,得到18个字节。
但是,当将字符数组变量a[]传递给func()函数时,字符数组变量a会将其地址传递给形参变量a1,此时形参变量a1就相当于一个指针。
那么,在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