精华内容
下载资源
问答
  • C++ 数组长度
    千次阅读
    2018-08-02 23:40:26

    初学c++,到数组的时候想手动写一下循环输出数组内容的简单循环,int arrayint[]=(1,2,3,4,5);

        for (size_t i = 0; i <sizeof(arrayint); i++)
        {
            cout << arrayint[i] << endl;
            cout << "i="<<i << endl;

        }

    结果发现输出内容不对,i的值远远比size大,于是查资料了解一下sizeof是什么作用:

    sizeof是一个操作符(operator)。

    其作用是返回一个对象或类型所占的内存字节数。

    就是说它是用来描述一个对象占多少内存字节数的,

    所以它的数组大小看网上资料应该是sizeof(arrayint)/sizeof(arrayint[0]);

    之所以这么做是因为C++里给数组每个数据分配的内存大小是一样的

    另外一种方法是使用vector,不做赘述。

     

    更多相关内容
  • 样例数组:int myArray[]={1,3,5,7,9,11}; 取数组大小: int ArrayLen = sizeof(myArray); =====》 24 ------->6个指针的大小 指向数组的指针: int *pa = myArray; 计算指针大小: printf("指针的大小%ld\n",...

      效果:

     

        样例数组: int myArray[]={1,3,5,7,9,11};
        取数组大小: int ArrayLen = sizeof(myArray);     =====》  24  ------->6个指针的大小
        指向数组的指针: int *pa = myArray;
        计算指针大小: printf("指针的大小%ld\n",sizeof(*pa));      ======> 4

       根据指针取地址内容:
        printf("%d\n",*pa);        =======》 1
        printf("%d\n",*(pa+1)); =======》 3
        printf("%d\n",*(pa+2)); =======》 5
        printf("%d\n",*(pa+3)); =======》 7
        printf("%d\n&

    展开全文
  • C++数组长度可以为变量吗?

    千次阅读 多人点赞 2020-05-25 21:51:45
    关于C++数组提出几点问题: 预备 先看下这两段代码 变量作为数组的长度可行吗? #include <iostream> using namespace std; void func(int num) { int array[num]; // num > 0 cout << "num ...

    关于C++数组提出几点问题:

    预备

    先看下这两段代码

    1. 变量作为数组的长度可行吗?
    #include <iostream>
    using namespace std;
    
    void func(int num) {
        int array[num]; // num > 0
        cout << "num " << num << endl;
        cout << "sizeof array " << sizeof(array) << endl;
        array[0] = 20;
        cout << "array[0] " << array[0] << endl;
    }
    
    int main() {
        func(6);
        return 0;
    }
    

    输出:

    num 6
    sizeof array 24
    array[0] 20
    
    1. 访问超过长度的数组下标的值会发生什么?
    #include <iostream>
    using namespace std;
    
    void func() {
        int array[10];
        array[3] = 1;
        array[20] = 3;
        cout << "sizeof array " << sizeof(array) << endl;
        cout << "array[3] " << array[3] << endl;
        cout << "array[20] " << array[20] << endl;
    }
    
    int main() {
        func();
        return 0;
    }
    

    输出:

    sizeof array 40
    array[3] 1
    array[20] 3
    

    分析

    首先分析问题1,我们平时看书学习过程中总看见说C++的数组长度一定要是常量且不能是变量,很多资料需要在编译期确定栈帧的大小,如果是变量就不能在编译器确定栈帧大小,但上述代码为什么可以正常运行呢?光看不如实践,先看这样一段代码:

    #include <iostream>
    using namespace std;
    
    void func2() {
        int a;
        int b[4];
        int c;
        cout << "func2a address " << &a << endl;
        cout << "func2b address " << &b << endl;
        cout << "func2c address " << &c << endl;
        // func1();
    }
    
    void func3(int num) {
        int a;
        int b[4];
        int c;
        cout << "func3a address " << &a << endl;
        cout << "func3b address " << &b << endl;
        cout << "func3c address " << &c << endl;
        func2();
    }
    
    void func4(int num) {
        int a;
        int b[4];
        int c;
        cout << "func4a address " << &a << endl;
        cout << "func4b address " << &b << endl;
        cout << "func4c address " << &c << endl;
        func3(num);
    }
    
    
    int main() {
        func4(5);
        return 0;
    }
    

    输出:

    func4a address 0x7ffeb675f418
    func4b address 0x7ffeb675f420
    func4c address 0x7ffeb675f41c
    func3a address 0x7ffeb675f3c8
    func3b address 0x7ffeb675f3d0
    func3c address 0x7ffeb675f3cc
    func2a address 0x7ffeb675f378
    func2b address 0x7ffeb675f380
    func2c address 0x7ffeb675f37c
    

    再看这段代码:

    void func2() {
        int a;
        int b[4];
        int c;
        cout << "func2a address " << &a << endl;
        cout << "func2b address " << &b << endl;
        cout << "func2c address " << &c << endl;
        // func1();
    }
    
    void func3(int num) {
        int a;
        int b[num];
        int c;
        cout << "func3a address " << &a << endl;
        cout << "func3b address " << &b << endl;
        cout << "func3c address " << &c << endl;
        func2();
    }
    
    void func4(int num) {
        int a;
        int b[4];
        int c;
        cout << "func4a address " << &a << endl;
        cout << "func4b address " << &b << endl;
        cout << "func4c address " << &c << endl;
        func3(num);
    }
    
    
    int main() {
        func4(100);
        return 0;
    }
    

    输出:

    func4a address 0x7ffff2c76568
    func4b address 0x7ffff2c76570
    func4c address 0x7ffff2c7656c
    func3a address 0x7ffff2c76510
    func3b address 0x7ffff2c76360
    func3c address 0x7ffff2c76514
    func2a address 0x7ffff2c76328
    func2b address 0x7ffff2c76330
    func2c address 0x7ffff2c7632c
    

    func4a - func3a = 88

    func3a - func2a = 488

    从上面两段代码其实可以看出C++是支持变量长度的数组的,说不支持的那是很古老的编译器,在如下链接中也可以找到答案。

    https://c-for-dummies.com/blog/?p=3488

    https://www.drdobbs.com/the-new-cwhy-variable-length-arrays/184401444

    https://stackoverflow.com/questions/1887097/why-arent-variable-length-arrays-part-of-the-c-standard

    备注:尽管C++目前支持变量长度的数组,但是不建议使用,因为数组使用的是栈内存,栈内存是有大小限制的,一般是8192字节,既然长度是变量,那就可能是任何值,就有可能超过8192,这样就会stack overflow,所以动态内存最好使用堆内存。

    再分析问题2:操作超过数组长度的内存会发生什么?看下面这段代码:

    #include <iostream>
    using namespace std;
    
    void func() {
        int array[10];
        array[3] = 1;
        array[40] = 3;
        cout << "sizeof array " << sizeof(array) << endl;
        cout << "array[3] " << array[3] << endl;
        cout << "array[40] " << array[40] << endl;
    }
    
    int main() {
        int a[200];
        for (int i = 0; i < 200; ++i) {
            a[i] = 100;
        }
        for (int i = 0; i < 200; ++i) {
            cout << a[i] << " ";
        }
        cout << endl << "=====================" << endl;
    
        func();
        cout << "=====================" << endl;
        for (int i = 0; i < 200; ++i) {
            cout << a[i] << " ";
        }
        cout << endl << "=====================" << endl;
        return 0;
    }
    

    输出:

    root@3eaa9392a3d9:/ubuntu/test_dir# ./a.out
    100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
    =====================
    sizeof array 40
    array[3] 1
    array[40] 3
    =====================
    100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 3 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
    =====================
    

    看代码输出,在函数内操作超过数组长度的内存没有什么影响,但是它却导致了上一级的数组a[200]里的内容被改变,因为数组使用的是栈内存,经过问题1的代码输出以及分析可以看出,栈帧内存是向下增长的,代码中操作了超过数组长度的内存地址,就影响到了之前栈帧的内存数据,导致之前栈内存数据出现错误,可能就会引发大bug。

    总结

    C++中数组长度可以是变量,但是不建议使用,因为数组使用的是栈内存,变量可以是个比较大的数,这样会导致stack overflow,建议使用堆内存。而且这不是C++的标准,标准是不允许使用变量的,这属于gcc的扩展

    具体可以看下这个issue:https://github.com/chengxumiaodaren/cpp-learning/issues/4

    操作超过数组长度的内存可以编译通过且表面上看不出来问题,但是会导致栈内存出现脏写,最终可能会引发难以排查的bug,建议数组使用std::array,操作超过长度的下标会抛异常有利于开发者及时发现错误。

    展开全文
  • C++数组长度

    万次阅读 2017-07-25 11:51:07
    C++数组长度为: int arr_length = sizeof(arr) / sizeof(arr[0]); 为了方便使用,在C语言中常定义宏来求数组长度 #define ARR_LEN(array, length){ length = sizeof(array) / sizeof(array[0]); } 使用时...
    C++求数组长度为:

    int arr_length = sizeof(arr) / sizeof(arr[0]);

    为了方便使用,在C语言中常定义宏来求数组长度

    #define ARR_LEN(array, length){ length =  sizeof(array) / sizeof(array[0]); }

    使用时,直接调用宏函数即可,如

    int arr[]={1,2,3,4,5};

    int len;

    ARR_LEN(arr, len);  //此时len赋值为5

    在C++中,也可以定义模板函数

    template <class T>

    int getArrayLen(T &array){

    return sizeof(array) / sizeof(array[0]);

    }

    使用时,调用模板函数,如

    string arr[]={"abc", "ab", "abcde", "1234567", "890"};

    int len=getArrayLen(arr);  //此时len赋值为5


    //  **************************  注意!!!!********************************  //

    当数组传入函数时,传入的是指针,指针仅指向数组头arr[0],不带有任何长度信息,所以在传入数组时,要把数组长度同时传入函数。

    可以考虑一下,下面这个函数调用时,会输出什么?

    void length_array(int arr[]){ 

    int len=getArrayLen(arr);

    cout<<"len="<<len<<", sizeof(arr)=" << sizeof(arr)<<endl;

    }

    Output: len=1, sizeof(arr)=4;

    这是因为arr是指针,而指针所占空间是4个字节,所以sizeof(arr)/sizeof(arr[0])=1.

    //  ****************************************************************************************

    请牢记:如果把数组作为参数传入函数,那么这个数组会退化为一个指针 int *arr

     ****************************************************************************************  //


    下面说一下size(), length(), strlen()

    先说 size() 和 length(),这两个方法都要先 include <string>,两者使用起来无任何差别。

    即,str.size() == str.length() 为真

    引用cplusplus.com中的话:

    Both string::size and string::length are synonyms and return the same value, which is the length of the string, in terms of bytes.

    而 strlen() 是<cstring>中的,是C语言的遗留物。

    引用cplusplus.com中的话:

    cstring::strlen returns the length of the C string str. In C++, char_traits::length implements the same behavior. 

    即 strlen(str) == str.length() == str.size() 为真

    #include "iostream"
    #include <string>
    using namespace std;
    
    int main()
    {
        int *d = new int[10];
        cout << sizeof(d) << endl; // 4    d是我们常说的动态数组,但是他实质上还是一个指针,所以sizeof(d)的值是4。
    
        cout << sizeof(string*) << endl; // 4
        cout << sizeof(int*) << endl; // 4
        cout << sizeof(char****) << endl; // 4
        //可以看到,不管是什么类型的指针,大小都是4的,因为指针就是32位的物理地址。
        // 结论:只要是指针,大小就是4。(64位机上要变成8也不一定)。
    
        int Array[] = { 1, 2, 3, 4, 5, 6};
        int ArrLen = sizeof(Array) / sizeof(Array[0]);
        cout << sizeof(Array) << sizeof(Array[0])<< ArrLen << endl;  //24 4 6
        
        char aa[] = "abcdef";
        cout << sizeof(aa) << sizeof(aa[0]) << sizeof(aa) << endl;  //7 1 7
    
        char str[20] = "0123456789";
        int a = strlen(str); //a=10; 
        int b = sizeof(str); //而b=20; 
        cout << a << b << endl;
    
        string str1 = "hello";
        cout << str1.length() << str1.size() << endl; //55
        cout << sizeof(str1) << endl;//28
        cout << sizeof(string) << endl; //28  无论你的string里放多长的字符串,它的sizeof()都是固定的,字符串所占的空间是从堆中动态分配的,与sizeof()无关。   
        cout << str1.size() / str1.length() << endl;//返回字节数
    
        char* ss1 = "012345678";
        cout << sizeof(ss1) << endl;//4
    
        getchar();
        return 0;
    }


    参考文献及资料

    http://www.cplusplus.com

    http://blog.csdn.net/bopzhou/article/details/6063163

    http://henry-roamer.lofter.com/post/261768_698d3bd

    展开全文
  • 头文件中,用于字符数组和字符串,返回的是字符串的长度,不会算上结束位置的'\0'。 #include <iostream> // #include <iomanip> #include <cstring> using namespace std; int main() { ...
  • c++数组长度问题

    2018-03-08 14:02:39
    c++ 规定不能使用变量作为数组长度(虽然在ubuntu下编译不会出问题,但在其他系统可能就会报错),必须使用常量例如:int num=10;int array[num]; //报错const int num=10;int array[num];//正常这是因为数组作为...
  • c++获取数组长度查找算法 介绍 (Introduction) In this article, we are going to learn about the various ways following which we can find array length in C++. 在本文中,我们将学习在C ++中可以找到数组长度...
  • C++ 计算数组长度

    千次阅读 2020-01-11 12:10:15
    // C++计算数组长度 for (int j = 0; j (s) / sizeof(s[0]); j++) { i = s[j]; cout ; } system("pause"); return 0; } 程序解释 sizeof() 是C语言中保留关键字,也可以认为是一种运算符——单目...
  • 主要介绍了C/C++中获取数组长度的方法,很实用的一种方法,需要的朋友可以参考下
  • C++ 获取数组长度

    万次阅读 2020-07-14 14:44:59
    C++ 获取数组长度 1 字符串数组 对于字符串数组,使用strlen()函数来获取字符串数组的长度。 char a1[] = "fwegweasdasdwqew"; cout << strlen(a1) << endl; 2 数字数组 例如: int arr[] = { 1,5,9,10...
  • C++获取数组长度

    2019-12-29 19:51:43
    本文转载自:...比如 int int_ary[5] ,静态数组在编译的时候就知道了数组长度,这对编译器来说挺好实现的。 用得最多的大概就是sizeof了吧: #define countof_macro(x) ...
  • C/C++数组长度的获取

    2018-11-05 13:26:35
    一维数组的长度网上有比较多的说明,而我正好要用到二维数组长度的获取 所以整理一下记录下来: 言归正传 在C++里,字符串长度可以用strlen()函数获取,但是C++不支持数组的长度直接获取,所以我们要用数组的...
  • C++ 获取数组长度函数比较

    千次阅读 2019-11-10 17:12:56
    获取数组长度,是经常需要用到的函数。以下做一些常用的比较 1. size()与length(),获取字符串长度时,作用相同的。 2. sizeof()是用来获取对象所占内存的大小。 3. size()是获取字符元素的函数, 用于...
  • C++数组长度问题

    千次阅读 2016-01-19 20:53:10
    今天写代码的时候突然发现个问题,有类似这样一个函数,数组作为参数 void FormHead::ShowNum(intnumOfBoth[]) {  if(curMapId== 3)  {  FlashValueconditionNum[4];  conditionNum[0].SetInt(numOfBoth...
  • 通过引用一个数组来读取起长度 (&arr)先前调其为引用,_Ty [_Size]指出起引用值的类型 template<typename _Ty, size_t _Size> size_t GetArrSize( _Ty(&arr)[_Size]) { return _Size; } 2.模板函数2...
  • sizeof()是一个运算符可以获取数组的字节数,再除去数组的一个元素的字节数,就可以得到数组长度了 #define size(num,n) sizeof(num)/sizeof(num[0])//num[0]可以换成任意一个数组元素 //or: int len = sizeof(num...
  • C++常用获取数组长度方式

    千次阅读 2019-11-19 14:32:08
    // 输出4 } //测试未通过 上面的方法适用于静态数组,动态的数组(new[])是无法获取元素个数的。 #include“string.h” strlen(a)求字符数组的大小是 sizeof(a)/sizeof(a[0]);这种基本上万能
  • C++中获取数组长度的方法

    千次阅读 2019-11-05 11:45:22
    主要的计算公式为: 长度=sizeof(数组名)/sizeof(数组类型)
  • c++获取数组长度

    万次阅读 2019-05-14 22:35:51
    我们知道上面的代码,结果永远等于1,要想不使用函数模板,单纯使用函数,正确得到数组长度,代码要这么写 int foo(int (&arr)[4]) { return sizeof(arr) / sizeof(arr[0]); } int main(){ int arr[4] = {1,...
  • C++函数求数组长度

    2020-07-08 16:31:10
    还不理解 #include <iostream> using namespace std; template <typename T, int N> int getlen(T(&)[N]) { return N; } int main() { int ary[] = { 1, 2, 3 }; cout <...}
  • c++ 获取数组长度

    千次阅读 2018-09-13 11:38:41
    1、对于数组或者传递的数组参数,可以直接使用如下的宏或者类似的函数来获取。 #define getArrayLen(array,len) {len = sizeof(array)/sizeof(array[0]);} 2、对于指向数组的指针,可以通过指针来获取数组大小。 ...
  • C++ 用变量定义数组长度

    千次阅读 2020-05-24 20:40:34
    问题: 如何传入一个参数n,作为数组的大小? 我们知道,数组初始化不能用int a[n]这种形式,不能以变量n来直接初始化数组。 但是我们可以用malloc来为数组指定一块内存空间: int *a; a=malloc(n*sizeof(n)); ...
  • C++ 中没有提供直接获取数组长度的方法,(比如java/python中有length方法)我们可以使用sizeof来计算出数组的长度,具体的如下: len = (sizeof(array) / sizeof(array[0]) demo 练习 #include <iostream> ...
  • C++中的数组长度可以是变量吗?

    千次阅读 2021-03-02 14:13:21
    C++中的数组长度可以是变量吗? #include <stdio.h> void fun(int num) { int array[num]; array[0] = 1; array[40] = 666; printf("funArray=%x\n",array); printf("funArraySize=%ld\n",sizeof(array...
  • 前言:c++中不提供直接获取数组长度的方法,对于c语言字符串char型长度可以使用strlen()函数获取,而c++中的向量vector可以使用vector.size()获取向量长度,字符串string可以使用成员函数length()获得 #include <...
  • C++获取数组长度(自写函数实现)

    千次阅读 2018-10-10 13:24:15
    想获取 C++ 数组长度,上网找了一些,没有找到满意的结果,网上大多数都是通过sizeof函数,但是这个函数是获取占用空间的,如果定义一个char类型的数组,那通过sizeof(char)获得的是四,并不是我们要求的字符串...
  • C++数组长度增长

    千次阅读 2018-12-10 20:19:29
    /************************************************************************/ /* 把数组长度变长 */ /********************************************************...
  • C++改变数组长度

    千次阅读 2018-06-05 20:20:00
    C++改变数组长度 代码 //改变数组长度 #ifndef CHANGELENGTH1D_H #define CHANGELENGTH1D_H #include<stdexcept> #include<algorithm> template<typename T> void changeLength1D(T *&a,...
  • c++中求数组长度

    2021-09-08 16:58:27
    数组长度=sizeof(数组名)/sizeof(数组类型) #include<iostream> using namespace std; int main() { int intArr[] = { 1,2,3,4,5 }; char charArr[] = "abcdefgh"; //sizeof(数组名)/sizeof(数组类型) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 235,200
精华内容 94,080
关键字:

c++数组长度

c++ 订阅
友情链接: Flip_src.zip