今天在调试程序的时候突然发现,将数组首地址和数组长度做为参数传递给函数时,将数组长度作为下标访问数组, 得到的是数组的长度。
环境:
操作系统: 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; }