精华内容
下载资源
问答
  • C语言实现数组长度计算方法

    千次阅读 2018-08-03 22:23:31
    C时,经常要用到计算数组长度,我一般用下面这种方法: #define LEN(x) sizeof(x) / sizeof(x[0]) 即利用库函数sizeof来计算数组长度,这种方法,对一维数组和多维数组都有效,如以下代码示例: #include &...

    写C时,经常要用到计算数组长度,我一般用下面这种方法:

    #define LEN(x) sizeof(x) / sizeof(x[0])

    即利用库函数sizeof来计算数组长度,这种方法,对一维数组和多维数组都有效,如以下代码示例:

    #include "stdio.h"
    
    #define LEN(x) sizeof(x) / sizeof(x[0])
    
    int main(int argc, char *argv[])
    {
    	int one[2] = {1, 1};
    	int two[2][1] = {{1}, {2}};
    	int three[3][2] = {{1, 2}, {1, 2}, {1, 2}};
    	
    	printf("%d\n", LEN(one));
    	printf("%d\n", LEN(two));
    	printf("%d\n", LEN(three));
    	
    	return 0;
    }

    这是运行结果:

    展开全文
  • C语言数组长度计算详解

    万次阅读 2020-05-23 18:23:01
    1) C语言计算数组长度大小 C语言字符串长度的计算可以使用strlen(str); 但是对于数组长度的大小却没有相关函数可以使用; C语言数组长度的大小可以使用: int main() { int arr[] = {1,2,3,4,5}; int length = ...

    一、 C语言中计算数组长度大小

    C语言字符串长度的计算可以使用strlen(str); 但是对于数组长度的大小却没有相关函数可以使用;
    C语言数组长度的大小可以使用:

    int main()
    {
    	int arr[] = {1,2,3,4,5};
    	int length = sizeof(arr)/sizeof(int);
    	printf("the length of arr is %d\n", length);
    }
    

    二、 在函数调用中计算数组的长度

    上述计算数组长度的方法在函数调用中不可使用,有bug;
    考虑下面代码:

    #include <stdio.h>
    
    void test(int *arr){
            int length = 0;
            length = sizeof(arr)/sizeof(int);
            printf("test: array sizees %d\n", sizeof(arr));
            printf("test: array length %d\n", length);
    }
    
    int main()
    {
            int arr[] = {1,2,3,4,5,6,7,8,9};
            int length = 0;  
        
            length = sizeof(arr)/sizeof(int);
            test(arr);
            printf("main: array sizees %d\n", sizeof(arr));
            printf("main: length of array %d\n", length);
    }
    
    

    其结果是:
    在这里插入图片描述
    造成上述结果的原因是:
    主函数中,正确计算得到数组长度是9,并且数组内存大小是36字节,因为这时候arr是数组首元素,sizeof(arr) 计算得到的是一整段连续内存空间的大小,即36字节;
    子函数中, 由于主函数中的数组首元素经过函数参数传递给子函数, 将实参赋值给形参的过程中,数组首元素转化为一个整型指针,所以子函数中sizeof(arr)得到的是一个指针内存大小。博主电脑是64位,而整型int大小是4位,最后得到数组长度是2;

    三、 在子函数中得到主函数中数组长度的方法

    建议方法是在传递数组首地址的时候,一同将数组长度也传递过去

    #include <stdio.h>
    void test(int arr[], int length)
    {
            for(int i = 0; i < length; i++)
                    printf("%d, ", arr[i]);
            printf("\n");
    }
    
    int main()
    {
            int arr[] = {1,2,3,4,5,6,7,8,9};
            int length = sizeof(arr)/sizeof(int);
        
            test(arr, length);
    }
    

    四、 将数组和数组长度传递给子函数对于数列是可行的,但是对于二维数组(即表),会产生Segmentation fault(core dump)错误;

    #include <stdio.h>
    #include <stdlib.h>
    void test(int **arr, int n)
    {
            for(int i = 0; i < n; i++)
                    arr[i][i] = 0;   
    }
    
    int main()
    {
            int n = 6;
            int arr[n][n];
            for(int i = 0; i < n; i++)
                    arr[i][i] = 0;
            test(arr, n); 
    }
    

    原因分析:主函数中,将二维数组都赋值为0;可以实现;
    子函数中, 将二维数组赋值为0,失败;经过分析,子函数中一旦出现arr[i][i] 语句就会失败; 本人猜测的原因在于,arr在主函数中是数组首地址, arr在子函数中就是一个单纯的指针。 C语言内部有实现arr[i][j]计算的机制,即&arr[i][j] = &arr + sizeof(arr[i]) *i + sizeof(int) *j; 由于arr只是一个单纯的指针,这个计算机制失效;(具体的原因细节没有找到资料,望广大网友提供)

    其他解决办法:
    1) 在子函数test中,函数声明变成如下所示,编译不会出错

    void test(int arr[][n], int n)
    

    2) 将arr声明为全局变量, 也不会有编译出错
    3) 即将arr声明为全局变量, 又使用int [][n], 也会出现意想不到的错误;

    五、 解决子函数中使用二维数组的办法

    对于第4点,可以使用下面代码实现在子函数中对二维数组元素的访问, 避免了使用arr[i][j]计算机制;

    #include <stdio.h>
    #include <stdlib.h>
    void test(int **arr, int n)
    {
            for(int i = 0; i < n; i++)
                    *((int *)arr + n*i +i) = 0;	//arr[i][i] = 0;   
    }
    
    int main()
    {
            int n = 6;
            int arr[n][n];
            for(int i = 0; i < n; i++)
                    arr[i][i] = 0;
            test(arr, n); 
    }
    

    六、 C++中,在子函数中对二维数组对角线赋值应注意初始化

    使用vector数组的时候,如果使用下标arr[][], 一定要注意下标越界,因为vector并不进行下标越界检查;

    #include <iostream>
    #include <vector>
    
    using namespace std;
    
    void test(vector <vector<int>> & arr) {
    	for (int i = 1; i < arr.size(); i++)
    		arr[i][i] = 1;
    }
    
    int main()
    {
    	int n = 6;
    	
    	vector<vector<int>> arr;	//编译无误,因为arr.size() == 0;arr[i][i]没有执行
    	//编译有误,元素vector<int> 没有初始化,使用m[i][i]出错
    	vector<vector<int>> arr(n);	
    	vector<vector<int>> arr(n, vector<int>(n));	//编译无误
    	test(arr);
    	return 0;
    }
    
    
    展开全文
  • 本文章详细介绍了C语言常见的定义数组的方式,并且详细讨论了strlen与sizeof求解数组的原理和使用情况。适合C语言的初学者阅读。

    最近在重新学习C语言,学习中发现之前对数组长度的计算方法模糊不清。因此做个总结。
    首先要明白什么是数组。
    数组是一组相同类型元素的集合。
    因此,要定义一个数组,首先要确定数组内的元素是同一种类型。

    1. 数组的创建

    首先来看看常用的数组的创建形式

    • int型
    	int arr1 [10] = {0};//定义了元素个数,且给第一个元素赋值为0,则其他元素均为0
    

    通过VS调试中的监视功能,可以看到各个数组的存放结果。

    在这里插入图片描述

    int arr2 [10] = {1, 2, 3, 4, 5};//定义了元素个数,但只给前五个元素赋值,则后五个元素均为0
    

    在这里插入图片描述

    int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定义了元素个数,且给所有元素均赋值
    

    在这里插入图片描述

    int arr4 [10];//什么都不放,编译器会给数组的每个元素放置随机数。
    

    在这里插入图片描述

    int arr5[] = {1, 2, 3};//不定义元素个数,给几个元素赋值就有几个元素。
    

    在这里插入图片描述
    注意:
    如果你定义了数组的大小(也就是【】号里面写了数字),但是没有给任何元素赋值,那么这个数组的所有元素都默认为一个随机数!!!如果你定义了数组大小,但只给部分元素赋值,那么剩余元素的值默认为0!!!(见上面arr4和arr5)。

    因此常用上面arr1的方式,给int型数组的全部元素设置默认值为0.

    • char型
    	char arr6[] = "abc";//没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0)
    

    在这里插入图片描述

    char arr7 [10] = "abc";//定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0
    

    在这里插入图片描述

    char arr8 [10] = {'a', 'b', 'c'};//定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0
    

    在这里插入图片描述

    char arr9 [10] = {'a', 98, '98'};//char定义数组,元素中出现没有用单引号的数字,会根据ASCII码输出字符
    

    在这里插入图片描述

    	char arr10[] = {'a', 'b', 'c'};//没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0)
    

    在这里插入图片描述
    注意:
    要格外注意举例中arr10和arr6的不同。同样为插入abc三个字符,但是arr6结尾有\0,arr10却没有,这在下一步求解数组长度的时候有相当大的区别!!!

    2. 求解数组的长度

    求解数组长度往往要用到两个函数,strlen或者sizeof

    • strlen求解数组长度

    strlen是用来求一个字符串(string)的长度,因此strlen不能用来求int类型的数组长度,只能求char类型的数字长度。
    具体代码如下:

    	char arr6[] = "abc";//没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0)
    	printf("length arr6 = %d\n", strlen(arr6));
    
    	char arr7 [10] = "abc";//定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0
    	printf("length arr7 = %d\n", strlen(arr7));
    
    	char arr8 [10] = {'a', 'b', 'c'};//定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0
    	printf("length arr8 = %d\n", strlen(arr8));
    
    	char arr9 [10] = {'a', 98, '98'};//char定义数组,元素中出现没有用单引号的数字,会根据ASCII码输出字符
    	printf("length arr9 = %d\n", strlen(arr9));
    
    	char arr10 [] = {'a', 'b', 'c'};//没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0)
    	printf("length arr10 = %d\n", strlen(arr10));
    

    在这里插入图片描述
    注意:
    1、从arr6和arr7中可以看出,用双引号定义的字符串数组都能正确计算出数组长度。这是因为这两个数组的****末尾都含有结束标志”\0“(具体看前面举例中的截图)。

    2、另外要注意的是,arr10输入了三个字符,但结果却是15个,这是因为在没有定义数组个数的时候,用大括号的形式赋值,结尾不会自动补充结束标志\0,导致这个结果是个随机数,strlen会在内存中一直计数,知道在内存中遇到了0才会停止技术。
    但是对比arr8和arr9,也是用了大括号赋值,但结果却是正确的,这是因为开始定义了数组的个数,没有初始化赋值的数组会默认赋值为0(与\0有一样的效果)。

    3、如果用strlen用来求int类型数组的长度,会发现strlen不能用了。

    	int arr1 [10] = {0};//定义了元素个数,且给第一个元素赋值为0,则其他元素均为0
    	printf("length arr1 = %d\n", strlen(arr1));
    
    	int arr2 [10] = {1, 2, 3, 4, 5};//定义了元素个数,但只给前五个元素赋值,则后五个元素均为0
    	printf("length arr2 = %d\n", strlen(arr2));
    
    	int arr4 [10];//什么都不放,编译器会给数组的每个元素放置随机数。
    	printf("length arr4 = %d\n", strlen(arr4));
    

    在这里插入图片描述

    • sizeof求解数组长度

    sizeof能计算变量或者数据类型所占用的内存(以字节为单位)。用sizeof计算数组长度时,sizeof不关心数组内部存储的是什么类型的数据。
    所以常常用 sizeof(arr)/sizeof(arr[0]) 来计算数组的长度。其中“sizeof(arr)“计算了整个数组arr占据了多少内存(字节为单位),”sizeof(arr[0])“计算了数组中第一个元素所占多少字节,两者相除就是数组的长度。

    代码如下:

    	int arr1 [10] = {0};//定义了元素个数,且给第一个元素赋值为0,则其他元素均为0
    
    	int arr2 [10] = {1, 2, 3, 4, 5};//定义了元素个数,但只给前五个元素赋值,则后五个元素均为0
    
    	int arr3 [10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};//定义了元素个数,且给所有元素均赋值
    
    	int arr4 [10];//什么都不放,编译器会给数组的每个元素放置随机数。
    	
    	int arr5[] = {1, 2, 3};//不定义元素个数,给几个元素赋值就有几个元素。
    
    	int len1 = sizeof(arr1) / sizeof(arr1 [0]);
    	int len2 = sizeof(arr2) / sizeof(arr2 [0]);
    	int len3 = sizeof(arr3) / sizeof(arr3 [0]);
    	int len4 = sizeof(arr4) / sizeof(arr4 [0]);
    	int len5 = sizeof(arr5) / sizeof(arr5 [0]);
    
    	printf("length arr1 = %d\n", len1);
    	printf("length arr2 = %d\n", len2);
    	printf("length arr3 = %d\n", len3);
    	printf("length arr4 = %d\n", len4);
    	printf("length arr5 = %d\n", len5);
    

    在这里插入图片描述
    可以看出,如果你一开始就定义了数组的大小,那么不管你插入多少个元素,求出来的结果永远是你定义的数组大小。
    如果你没有定义数组大小,那么算出来的就是你实际赋值的数组大小。

    	char arr6 [] = "abc";//没有定义元素个数,用双引号定义3个字符,末尾数组会自动加上结束标志(\0)
    
    	char arr7 [10] = "abc";//定义10个元素个数,用双引号赋值三个字符串,其余7个元素均自动定义为\0
    
    	char arr8 [10] = {'a', 'b', 'c'};//定义10个元素个数,用大括号和单引号赋值三个字符串,则数组只含有三个字符,剩余7个均为\0
    
    	char arr10 [] = {'a', 'b', 'c'};//没有定义元素个数,用大括号定义字符串,数组的元素个数则只有三个,结尾没有数组结束标志(\0)
    
    	int len6 = sizeof(arr6) / sizeof(arr6 [0]);
    	int len7 = sizeof(arr7) / sizeof(arr7 [0]);
    	int len8 = sizeof(arr8) / sizeof(arr8 [0]);
    	int len10 = sizeof(arr10) / sizeof(arr10 [0]);
    
    	printf("length arr6 = %d\n", len6);
    	printf("length arr7 = %d\n", len7);
    	printf("length arr8 = %d\n", len8);
    	printf("length arr10 = %d\n", len10);
    

    在这里插入图片描述
    注意:
    从arr6可以看出,当用sizeof求char类型数组的长度时,如果你没有定义数组长度,那么得出的结果会比实际大小大1。这是因为sizeof吧数组结尾的\0也算了进去。
    从arr7和arr8可以看出,如果定义了数组大小,跟int类型一样,不管怎么定义,定义了多少,结果都是你定义的那个数组大小。
    从arr10可以看出,如果你输入数组时用了大括号赋值,并且在结尾没有手动输入\0,那么算出的结果就是实际赋值的个数。

    总结:

    1. 定义数组时,要先明确数组的类型(int还是char或者其他类型)。
    2. sizeof不能用来计算已经定义好长度的数组的数组长度(如int arr[10] = {0},不能有中括号里的10)。
    3. strlen不能用来计算int类型的数组长度。
    4. int型计算数组长度,最好用 sizeof(arr) / sizeof(arr[0]) 来计算数组长度。
    5. char型数组如果要计算数组长度,一定要用双引号赋值。
    6. char型数组如果要用大括号赋值,一定要注意数组最后是否需要结束标志 \0
    展开全文
  • c语言数组长度计算 一维数组  计算数组的长度:       sizeof(数组名):得到这个数组占用内存的总长度       公式:        sizeof(数组名) / sizeof...

    c语言中数组长度的计算

    一维数组 

    计算数组的长度:
     
        sizeof(数组名):得到这个数组占用内存的总长度
     
        公式:

            sizeof(数组名) / sizeof(数组类型);

    二维数组 

    二维数组计算列数:
     
                    每行的总长度  / 元素占用的字节
     
                    sizeof(二维数组名[0]) / sizeof(类型)
     
                例: int nums[3][4];
     
                    sizeof(nums[0]) / sizeof(int);  //计算结果是4
     
                             
            二维数组计算行数:
                    二维数组的总长度  /  每行的长度
     
                    sizeof(二维数组名) / sizeof(而数组名[0])
     
                 例: int nums[3][4];
                 
                     sizeof(nums) / sizeof(nums[0]);  //计算结果是3


    展开全文
  • C语言——计算数组长度

    千次阅读 2019-02-22 12:12:29
    C语言中,定义数组之后可以通过sizeof(a)/sizeof(a[0])的方法获得数组长度。 然而,当数组当作参数到子函数中,以上获取数组长度得到的结果永远是1. 因为,a是函数参数,到了本函数中,a只是一个指针(地址,系统...
  • 对于事先没有确定数组长度的数组,之后对该数组进行赋值, 那么该如何确定数组长度呢?之前一般用sizeof(数组变量地址)/sizeof(数组变量类型)来计算, 经过多次上机验证,发现该方法只对事先确定数组长度的数组有效...
  • C语言计算数组长度的技巧

    多人点赞 2021-07-17 21:11:11
    C语言计算数组长度的技巧
  • 当函数的传入参数是数组时 我们看下面一段代码 void test1(int arr[]){ int len = sizeof(arr) / sizeof(arr[0]); printf("test1.len=%d\n", len); } int main(){ int arr[5] = { 1, 2, 3, 4, 5 }; int len ...
  • 数组长度计算

    万次阅读 2018-07-30 22:46:25
    可以用来计算数组的大小(数组所占字节数),但不是长度。 不过可以用它除以数组单个元素所占字节数计算长度: a[7] = {1,2,3,4,5,,6,7}; length = sizeof(a)/sizeof(a[0]); C++中可以用上述方法,不过还可以...
  • C语言动态创建数组并增加数组长度 #include <iostream> #include<stdlib.h> using namespace std; #define InitSize 10 typedef struct{ int *data; int MaxSize; int length; }Customer; void ...
  • C:char 数组长度计算

    千次阅读 2020-09-15 11:05:24
    字符素组长度计算‘\0’,还是不计算'\0'; char chs[7] = {'a', 'c', '0', 'z', '3','d'}; -----长度为6 ...字符数组长度计算:必须以终止符’\0'作为边界。 1.C语言允许用字符串的方式对数组作初.
  • 如何通过编程的手段获取某个数组长度呢? 答案是使用关键字 sizeof。 前面说过,用 sizeof 可以获得数据类型或变量在内存中所占的字节数。同样,用 sizeof 也可以获得整个数组在内存中所占的字节数。因为数组中每...
  • C语言如何计算数组长度

    万次阅读 多人点赞 2018-05-04 17:17:46
    (1)借助sizeof()函数 :#include&lt;stdio.h&gt;int main(){ // 定义一个整型数组, 并进行... // 计算数组中数据长度 : // 所有数据的字节数除以一个数据的字节数即为数据的个数 :  length = sizeof(arr) / ...
  • c语言数组长度

    千次阅读 2020-10-10 21:11:57
    C语言对于不同的数据类型的数组长度方式稍微有不同的地方: 1,对于字符数组长度 第一种使用strlen() #include<stdio.h> #include<string.h> int main() { char a[10]="dmeo"; printf("%d",strlen...
  • C语言计算数组长度

    千次阅读 2019-03-06 23:17:03
    字符串计算数组长度是strlen(),不要忘记#include&lt;string.h&gt; 和它不带最后一个null就没什么大问题。 sizeof()函数,用来计算()内的对象或者类型所占的内存字节数。用其来计算数组长度的方式很简单,...
  • C语言里获取数组长度

    2021-02-27 10:54:16
    C语言无法直接获取数组长度,但可以用sizeof()关键字获取数组实际可存放元素个数(不是数组存放了多少元素) C语言里,通过传递数组名参数到子函数中,以获得数组长度是不可行的 先说1: 用 sizeof 可以获得数据...
  • c语言计算数组长度的方法

    千次阅读 2018-11-25 08:44:53
    strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(sizeof()包括结束字符) #include<stdio.h> #include<string.h> int main(){ char a[]={"abcdd"}; printf("用strlen...
  • #include <stdio.h> int main() { char arr[]="bit"; int len=0; len = my_strlen(arr); printf("len=%d",len); return 0; } int my_strlen(char * str) { int count=0; while(*str!... .
  • C语言sizeof计算数组长度的问题

    千次阅读 2019-07-10 17:48:39
    c语言中,定义数组后可以用sizeof命令获得数组长度(可容纳元素个数)。 例如: int data[4]; int length; length=sizeof(data)/sizeof(data[0]); //数组占内存总空间,除以单个元素占内存空间大小 printf("length...
  • C语言 数组长度

    千次阅读 2019-04-29 08:47:13
    借助sizeof()函数 # include <stdio.h> int main(void) { int a[10] = {0}; printf("sizeof(a) = %d\n", ...sizeof(a) = 40 ,数组 a 是 int 型的,每个元素占 4 字节,所以长度为 10 的数组在内存中所占的...
  • 由于经常会遇到计算数组长度的问题,经过思考,考虑通过一个函数来实现数组长度计算。思路是这样的:通过形参将数组传递给长度计算函数,长度计算函数计算完成之后返回数组长度。但是在实际...
  • 一般情况下,对结构体类型的变量或者结构体类型的数组的赋值都是先定义一个结构体类型的变量,然后在对其属性进行赋值。例如: typedef struct Pi { int x; int y; } Pc; int main() { int i; Pc pc[2]; pc[0...
  • C语言如何获取数组长度

    千次阅读 2020-07-25 16:56:58
    C语言如何获取数组长度 #include<string.h> strlen(a)求字符数组的大小 sizeof(a)/sizeof(a[0]);求数组a内存空间中的元素个数,目前没看到现成的求数组有效长度的函数 sizeof使用注意事项: 当将数组...
  • C语言获取数组长度

    万次阅读 多人点赞 2019-03-09 10:22:34
    1、c语言中,定义数组后可以用sizeof命令获得数组长度(可容纳元素个数)。 例如: double a[] = {1,2,3,4}; int length; length=sizeof(a)/sizeof(a[0]); //数组占内存总空间,除以单个元素占内存空间大小 printf...
  • C语言中返回数组长度

    千次阅读 2020-05-11 11:46:40
    C语言中返回数组长度 sizeof(type) 用来返回字节长度,可以根据每种类型的不同,设置不同的偏移量,使其返回正确的数组长度。 一般用法:sizeof(array)/sizeof(array[0]) 上述用法就可以返回正确的数组长度,sizeof...
  • C语言获得数组长度的函数

    万次阅读 多人点赞 2018-09-06 17:05:15
    1、c语言中,定义数组后可以用sizeof命令获得数组长度(可容纳元素个数)。 例如: double a[] = {1,2,3,4}; int length; length=sizeof(a)/sizeof(a[0]); //数组占内存总空间,除以单个元素占内存空间大小 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 686,790
精华内容 274,716
关键字:

数组长度怎么计算c