编程练习写选择排序算法的时候,居然把sizeof函数使用错了,感觉还是有必要在这里写博客记录一下自己犯的这个低级错误,以警示自己编码:
下面是具体代码:
#include <iostream>
#define CountOfArray(a) (sizeof(a)/sizeof(a[0]))
using std::cout;
using std::endl;
/** Selection Sort**/
int findMaxItemIndex(int dataList[], int leftPos, int rightPos)
{
int maxPos = leftPos;
int currentPos= leftPos;
while(++currentPos < rightPos)
{
if(dataList[currentPos] > dataList[maxPos])
{
maxPos = currentPos;
}
}
return maxPos;
}
void selection_sort(int dataList[], int count)
{
//错误的用法:参数传进来的数组指针,sizeo函数调用后应该是指针的长度而不是数组的长度。
int len = CountOfArray(dataList);
if(len != count)
{
cout<<"Array len is :"<<len<<endl;
cout<<"Array Lenght is not right."<<endl;
return;
}
for(int i=count-1; i>0; --i)
{
int curMaxPos = findMaxItemIndex(dataList, 0, i);
if(curMaxPos != i)
{
int temp = dataList[i];
dataList[i] = dataList[curMaxPos];
dataList[curMaxPos] = temp;
}
}
}
int main()
{
const int count = 10;
int data[count] = {7,2,6,4,0,9,5,1,3,8};
int len = CountOfArray(data); //正确的用法
if(len != count)
{
cout<<"Array Lenght is not right."<<endl;
return -1;
}
selection_sort(data, count);
for(int i = 0; i< count; i++)
{
cout<<data[i]<<endl;
}
getchar();
}
如果sizeof(数组名)的调用有两种情况:
1. 数组作为参数压栈,并作为参数传入
sizeof(数组名)
:计算出来的值实际上是指针的长度。
2. 数组是在当前的函数中定义,随后作为参数
传入
sizeof(数组名)
:
计算出来的值是整个数组的长度。但是如果当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。