zoukankan      html  css  js  c++  java
  • C/C++不能在子函数中求主函数中的数组长度

    #include <iostream>
    using namespace std;
    
    //直接在调用的时候传入长度的方法才是正确的 
    int getLengthCorrectly(int arr[], int length) { //相当于 int* arr
    	int sum=0;
    	for(int i=0; i<length; i++) {
    		sum+=arr[i];
    	}
    	return sum;
    }
    
    void getLengthInError(int arr[]) { //相当于 int* arr 
    	
    	//下方输出的是数组首元素所在的地址 
    	cout << "The address of the first index in array is: " << arr << endl;
    	
    	//下方输出的是数组下标第一个元素的长度,因为所在地址的值是0x6ffe00,所以会是8
    	cout << "The size of first index's address in array is:" << sizeof(arr) << endl; //8
    	
    	//用首元素所在的地址长度除去一个整型变量所占的字节数4,就是8/4=2 
    	int length=sizeof(arr) / sizeof(arr[0]); 
    	cout << "The final calculated length is: " << length << endl; //2 
    }
    
    
    int main() {
    	int arr[] = { 3, 1, 2, 4 };
    	int length=sizeof(arr) / sizeof(arr[0]); //在主函数中计算的时候,不会出现只计算首元素地址长度的情况
    	cout << "Length(correct) got in Main function is: " << length << endl; 
    //    int result = getLengthCorrectly(arr, length);
    	getLengthInError(arr);
    	return 0;
    }
    

    初学者在使用C/C++编写获取数组长度的代码时会发现一个错误,经过反复调试发现:在主函数中求长度和在子函数中求长度的结果不一样。至于为什么要在子函数中获取数组的长度,无非就是习惯于C#或者Java那种一个函数传过来直接就可以通过array.Length获取数组长度的方式,不想再在调用时多传一个关于数组长度的参数。
    然而由于C/C++相对更偏底层,我们会发现我们在子函数中求数组内部的“偷懒”方式并非能够像我们所想象的那样。

    我们都知道,参数的传递是把实参的值或副本或地址传递给形参,但数组较例外,数组传递时只会传递数组的首地址,函数在后面需要用到数组元素时再根据首地址和下标去找,因而这就导致了刚开始的错误。 所以一般都是在主函数/调用的地方中求出数组的具体长度,然后将长度作为参数传递给子函数。




    作者:艾孜尔江

  • 相关阅读:
    安装的时候,突然安装程序关闭,的灵异问题。
    CSAPP阅读笔记(1)-序
    CSAPP阅读笔记(2)-虚存管理
    nafxcwd.lib(afxmem.obj) :error LNK2005:"void * __cdecl operator new(unsigned int)"
    Linux内核源代码情景分析读书笔记(5)-关于fork/clone/vfork
    [转]调试经验总结VC下的错误对话框
    IP数据包首部的校验和算法
    Matlab画图及生成exe文件
    VC++6.0中的new
    Linux内核模块编译、加载&卸载及查看运行结果
  • 原文地址:https://www.cnblogs.com/ezhar/p/13901733.html
Copyright © 2011-2022 走看看