今天在调试程序的时候突然发现,将数组首地址和数组长度做为参数传递给函数时,将数组长度作为下标访问数组, 得到的是数组的长度。
环境:
操作系统: Centos 5.6
编译工具:gcc 4.1.2
代码如下:
#include <stdio.h>
static void fun(int *arr, int len)
{
printf("%d\n", arr[len]);
}
int main(void)
{
int a[] = { 1, 2, 3 };
int len = sizeof(a) / sizeof(int);
fun(a, len);
return 0;
}
输出结果为3.
进一步测试发现,double类型的数组得到的结果是3059700, char类型的数组得到的是1.如果越过更多,则double之后的结果都是1, char类型之后都是0,int类型之后则是无序的数。测试代码如下:
#include <stdio.h>
/*
0: int
1: char
2: double
*/
static void fun(void *arr, int len, int type)
{
int i;
switch(type) {
case 0:
printf("integer array: %d\n", ((int *)arr)[len]);
for(i = 1; i < 100; ++i)
printf("integer array: %d\n", ((int *)arr)[len + i]);
break;
case 1:
printf("character array: %d\n", ((char *)arr)[len]);
for(i = 1; i < 100; ++i)
printf("character array: %d\n", ((char *)arr)[len + 1]);
break;
case 2:
printf("double array: %d\n", ((double *)arr)[len]);
for(i = 1; i < 100; ++i)
printf("double array: %d\n", ((double *)arr)[len + 1]);
break;
default:
break;
}
}
int main(void)
{
/* integer array */
int int_arr[] = {1, 3, 4};
int int_len = sizeof(int_arr) / sizeof(int);
fun(int_arr, int_len, 0);
/* character array */
char char_arr[] = { 'a', 'b', 'c' };
int char_len = sizeof(char_arr) / sizeof(char);
fun(char_arr, char_len, 1);
/* double array */
double double_arr[] = { 1.1, 2.1, 3.3 };
int double_len = sizeof(double_arr) / sizeof(double);
fun(double_arr, double_len, 2);
return 0;
}
测试结果如图所示