C语言传递数组到函数的一个发现

今天在调试程序的时候突然发现,将数组首地址和数组长度做为参数传递给函数时,将数组长度作为下标访问数组, 得到的是数组的长度。

环境:

操作系统: 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;
}
测试结果如图所示

你可能感兴趣的:(C语言传递数组到函数的一个发现)