C语言数组作为形参传递,关于sizeof的一个错误

今天复习排序算法时用C语言实现,出现一个问题。

void insertSort(int a[]){
	int i, j, cur;
//	printf("%d %d\n",sizeof(a),sizeof(a[0]) );
	for(i=1; i<sizeof(a)/sizeof(int); i++){
		cur = a[i]; 
		for(j=i-1; j>=0 && a[j]>cur; j--){
			a[j+1] = a[j];
		}
		a[j+1] = cur;
	}
	return ;
}

排序结果只有前两个数字正确,后面的没有改变。原因是:sizeof(a)/sizeof(int)在函数内使用错误。

a是函数参数,到了本函数中,a只是一个指针(地址,系统在本函数运行时,是不知道a所表示的地址有多大的数据存储空间,这里只是告诉函数:一个数据空间首地址),所以,sizoef(a)的结果是指针变量a占内存的大小,一般在64位机上是8个字节。所以这里sizeof(a)/sizeof(int)的值永远是2。

解决办法是,在函数外部计算出数组a的长度n,再传入函数内使用。

 

posted @ 2020-09-12 21:50  Eunice呀  阅读(762)  评论(1)    收藏  举报