关于sizeof的误用问题

9 篇文章 0 订阅
编程练习写选择排序算法的时候,居然把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(数组名) 计算出来的值是整个数组的长度。但是如果当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。

看到这里,你应该已经明白我犯的低级错误和我这里要说的意思, 如果你希望提高你的代码安全性,对数组的长度进行判断,那么请注意,如果你把数组作为参数产给函数,并在函数内被sizeof函数计算,可想而知,结果一定不是你的初衷。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值