精华内容
下载资源
问答
  • C语言数组初始化

    千次阅读 2019-01-13 23:23:20
    C语言数组初始化 wchar_t wname[128]={0}; char cname[256]={0}; 我感兴趣的是: 1. 这种赋值的结果。 2. 这种形式是否符合标准编码规则? 我找到了如下资料,可能有助于对这个知识点的掌握。 /*初始化值的...

    C语言数组初始化

    wchar_t wname[128]={0};

    char cname[256]={0};

    我感兴趣的是:

    1. 这种赋值的结果。

    2. 这种形式是否符合标准编码规则?

    我找到了如下资料,可能有助于对这个知识点的掌握。

    /*初始化值的个数可少于数组元素个数。当初始化值的个数少于数组元素个数时,前面的按序初始化相应值,后面的初始化为0(全局或静态数组)或为不确定值(局部数组)*/

    我相信上面的资料是CC++语言的标准规范,但实际编译器处理时,可能会和规范有所不同。因为编译器原则上要遵从语言规范,但对于局部数组的不确定值到底是多少,怎么处理,编译器就可以灵活处理。我测试了三种编译器,其实编译器赋予的值是固定的,都是0*/

    一直以为 int a[256]={0};是把a的所有元素初始化为0int a[256]={1};是把a所有的元素初始化为1

    调试的时查看内存发现不是那么一回事,翻了一下《The C++ Programming Language》总算有定论。

    数组初始化

    数组可以用一个列值来初始化,例如

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

    char v2[]={'a','b','c',0};

    当数组定义时没有指定大小,当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定。所以v1v2分别为 int[4]char[4]类型。如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误。例如:

    char   v3[2] ={'a','b',0};   //错误:太多的初始化值了

    char   v3[3] ={'a','b',0};   //正确

    如果初始化时指定的的元素个数比数组大小少,剩下的元素都回被初始化为   0。例如

    int   v5[8]={1,2,3,4};

    等价于

    int   v5[8]={1,2,3,4,0,0,0,0};

    注意没有如下形式的数组赋值:

    void f()

    {

    v4={'c','d',0};   //错误:不是数组赋值

    }

    如果你想这样的复制的话,请使用vector或者valarray

    字符数组可以方便地采用字符串直接初始化,char   alpha []="abcdefghijklmn";

    下面来看一个例子:

    #include <iostream.h>

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

    static int array2[5]={1};

    void main()

    {

        int arr1[5]={2};

        static int arr2[5]={1,2};

        

        int n;

        cout <<"global: ";

        for(n=0; n<5; n++)

            cout <<" " <<array1[n];

        

        cout <<" global static: ";

        for(n=0; n<5; n++)

            cout <<" " <<array2[n];

        

        cout <<" local: ";

        for(n=0; n<5; n++)

            cout <<" " <<arr1[n];

        

        cout <<" local static: ";

        for(n=0; n<5; n++)

            cout <<" " <<arr2[n];

        cout <<endl;

    }

    在这个例子中,全局和静态数组都按语言规范要求被初始化为0,但是局部数组并没有向前面所说的为不确定值,下面是用gccVC6.0tuborC++分别编译的结果(gccg++编译c++文件,gcc不会链接库的):

    GCC

    VC6.0

    TurboC++

    这说明了对局部数组没有初始化的元素的值,这几种编译器都将其设置为0。但是,如果不对数组进行初始化,即在定义的同时没有用列表初始化,那么局部数组的值就取决于编译器而对程序员来说就是不可预料的了。有时间可以测试一下各个编译器,不过在vc中是0xcc,所以对局部数组的初始化要特别小心。但是全局的数组和静态数组还是会被正确的赋于0值的。

    展开全文
  • C语言数组初始化的三种方法

    万次阅读 多人点赞 2019-09-27 10:34:48
    C语言中,数组初始化的方式主要有三种: 1、声明时,使用 {0} 初始化; 2、使用memset; 3、用for循环赋值。 那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码: #define ARRAY_SIZE_MAX (1*1024...

    C语言中,数组初始化的方式主要有三种:

    1、声明时,使用 {0} 初始化;

    2、使用memset;

    3、用for循环赋值。

    那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码:

    #define ARRAY_SIZE_MAX  (1*1024*1024)
     
    void function1()
    {
        char array[ARRAY_SIZE_MAX] = {0};  //声明时使用{0}初始化为全0
    }
     
    void function2()
    {
        char array[ARRAY_SIZE_MAX];
        memset(array, 0, ARRAY_SIZE_MAX);  //使用memset方法
    }
     
    void function3()
    {
        int i = 0;
        char array[ARRAY_SIZE_MAX];
        for (i = 0; i < ARRAY_SIZE_MAX; i++)  //for循环赋值
        {
            array[i] = 0;
        }
    }

    效率:

    分别执行上面三种方法,统计下平均时间可以得出:  for循环浪费的时间最多,{0} 与memset 耗时差不多。

    原理:

    1、for循环赋值,就是循环赋值,不解释了

    2、memset,很容易找到memset内部实现代码,这里也不解释了

    3、{0} 内部是怎么实现的呢?

    将上述代码编译成汇编格式如下:

    function1如下:

    	pushl	%ebp
    	movl	%esp, %ebp
    	subl	$1048600, %esp
    	leal	-1048584(%ebp), %eax
    	movl	$1048576, %edx
    	movl	%edx, 8(%esp)
    	movl	$0, 4(%esp)
    	movl	%eax, (%esp)
    	call	memset
    	leave
    	ret

    function2如下:

    	pushl	%ebp
    	movl	%esp, %ebp
    	subl	$1048600, %esp
    	movl	$1048576, 8(%esp)
    	movl	$0, 4(%esp)
    	leal	-1048584(%ebp), %eax
    	movl	%eax, (%esp)
    	call	memset
    	leave
    	ret

    通过汇编代码可以看出,{0}初始化方式,调用了memset函数!
    对三种方法的选取:

    1、for 最浪费时间,不建议(其实memset内部也是用循环实现的,只不过memset经过了严格优化,所以性能更高);

    2、{0} 可能有移植性问题,虽然绝大多数编译器看到{0} 都是将数组全部初始化为0, 但是不保证所有编译器都是这样实现的;

    3、综合1、2, 推荐使用memset方法。

    上述代码,结果以及观点仅仅是一家之言,如果有问题,多谢指正!

    展开全文
  • C语言数组初始化及malloc初始化

    千次阅读 2021-05-06 20:39:20
    数组赋值初始化的三个方式 1、{0} 初始化 例如: int nums[3] = {0}; 但是经常出现的是给定长度(变量)然后需要进行初始化,如果写成下式: int main(){ int numsSize=0; scanf("%d",&numsSize); int ...

    前言

    做笔试题的时候老有些小错误,来总结一下。

    数组赋值初始化的三个方式

    1、{0} 初始化

    例如:

    int nums[3] = {0};
    
    • 但是经常出现的是给定长度(变量)然后需要进行初始化,如果写成下式:
    int main(){
    	int numsSize=0;
    	scanf("%d",&numsSize);
    	int nums[numsSize]={0};
    	}
    
    • 则会出现以下报错信息:
    • error: variable-sized object may not be initialized?这个提示是:变量大小的对象不能被初始化。
    • 显示如下错误信息的原因是可以用变量定义数组长度,但不可初始化
      在这里插入图片描述
    2、for 循环初始化
    • 该方式常用于获取输入时,将for循环中的内容改为**scanf("%d",&nums[i]);**即可实现。
    int nums[3];
    for (int i = 0; i < 3; i++) {
       nums[i] = i;
    }
    
    3、memset 函数
    • memset 一般使用“0”初始化内存单元,通常是给数组或结构体进行初始化,或清空数组或结构体。
    • 因此可以用变量定义数组长度,再通过使用memset函数使整个数组置0实现初始化。
    • 使用时需要使用库,#include <string.h>
    int main(){
    	int numsSize=0;
    	scanf("%d",&numsSize);
    	int nums[numsSize];
    	memset(nums,0,sizeof(int)*numsSize);
    	}
    

    注:需要注意的是:memset函数按字节对内存块进行初始化,所以不能用它将 int 数组初始化为 0 和 -1 之外的其他值

    使用malloc动态分配大小

    • 使用时需包含头文件:#include <stdlib.h>
    1、动态申请一维数组
    scanf("%d",&numsSize);
    int *temp = (int *)malloc(sizeof(int) * numsSize); 
    
    2、动态申请二维数组
    • 首先通过:pArray = (int **)malloc( n * sizeof(int * ) )该语句来分配所有行的首地址 。接着pArray[i] = (int *)malloc( m * sizeof(int) );来分配每行的首地址。
    	//获取行列数
    	scanf("%d %d", &n, &m );
    	//动态分配存储数组的大小
    	pArray = (int **)malloc( n * sizeof(int*) );
    	//使用双层循环将数据读入数组中
    	for( i=0; i<n; i++)
    	{
    	      pArray[i] = (int*)malloc( m * sizeof(int) );
    		for( j=0; j<m; j++)
    		{
    			scanf("%d", pArray[i] + j );
    		}
    	}
    
    3、对动态数组进行初始化
    • 希望在分配内存的同时进行初始化,请使用 calloc() 函数。

    • calloc() 函数是动态申请内存函数之一,相当于用malloc函数申请并且初始化一样,calloc函数会将申请的内存全部初始化为0。

    • calloc() 函数用来动态地分配内存空间并初始化为 0,其原型为:
      void * calloc (size_t num, size_t size);
      calloc()函数有两个参数,分别为元素的数目每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小。

    • calloc() 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了
      num*size 个字节长度的内存空间,并且每个字节的值都是0。
      如果 size 的值为 0,那么返回值会因标准库实现的不同而不同,可能是 NULL,也可能不是,但返回的指针不应该再次被引用。

     -   int *res = (int*)calloc(numsSize, sizeof(int)); 
     - //方法二:
     -  int *res = (int*)malloc(numsSize * sizeof(int));
        memset(res, 0, numsSize * sizeof(int));
        //测试代码
        for(int i=0;i<numsSize;i++){
    		printf("%d\n",res[i]);
    	}
    

    注:用memset给指针变量如p所指向的内存单元进行初始化时,n 千万别写成 sizeof( p ),因为 p 是指针变量,不管 p 指向什么类型的变量,sizeof( p ) 的值都是 4。

    参考文献

    C语言数组初始化的三种方式
    数组的定义,初始化和使用,C语言数组详解
    C语言-数组的初始化,数组和指针,函数与数组
    C语言中的malloc使用详解
    C语言malloc初始化问题
    C语言中的malloc、new、memset函数解析
    C语言 结构体使用malloc动态申请内存时,关于如何初始化结构体的解决方法
    数组相关知识学习总结(及malloc与memset初始化问题)(C语言)

    展开全文
  • C语言中,数组初始化的方式主要有三种:1、声明时,使用 {0} 初始化;2、使用memset;3、用for循环赋值。 那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码: [cpp] view plain copy #define ARRAY...

    C语言中,数组初始化的方式主要有三种:

    1、声明时,使用 {0} 初始化;

    2、使用memset;

    3、用for循环赋值。

     

    那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码:

     

    [cpp]  view plain  copy
     
    1. #define ARRAY_SIZE_MAX  (1*1024*1024)  
    2.   
    3. void function1()  
    4. {  
    5.     char array[ARRAY_SIZE_MAX] = {0};  //声明时使用{0}初始化为全0  
    6. }  
    7.   
    8. void function2()  
    9. {  
    10.     char array[ARRAY_SIZE_MAX];  
    11.     memset(array, 0, ARRAY_SIZE_MAX);  //使用memset方法  
    12. }  
    13.   
    14. void function3()  
    15. {  
    16.     int i = 0;  
    17.     char array[ARRAY_SIZE_MAX];  
    18.     for (i = 0; i < ARRAY_SIZE_MAX; i++)  //for循环赋值  
    19.     {  
    20.         array[i] = 0;  
    21.     }  
    22. }  

     

     

    效率:

    分别执行上面三种方法,统计下平均时间可以得出:  for循环浪费的时间最多,{0} 与memset 耗时差不多。

     

    原理:

    1、for循环,就是循环赋值,不解释了

    2、memset,很容易找到memset内部实现代码,这里也不解释了

    3、{0} 内部是怎么实现的呢?

    将上述代码编译成汇编格式如下:

    function1如下:

    [cpp]  view plain  copy
     
    1. pushl   %ebp  
    2. movl    %esp, %ebp  
    3. subl    $1048600, %esp  
    4. leal    -1048584(%ebp), %eax  
    5. movl    $1048576, %edx  
    6. movl    %edx, 8(%esp)  
    7. movl    $0, 4(%esp)  
    8. movl    %eax, (%esp)  
    9. call    memset  
    10. leave  
    11. ret  


    function2如下:

     

     

     

    [cpp]  view plain  copy
     
    1. pushl   %ebp  
    2. movl    %esp, %ebp  
    3. subl    $1048600, %esp  
    4. movl    $1048576, 8(%esp)  
    5. movl    $0, 4(%esp)  
    6. leal    -1048584(%ebp), %eax  
    7. movl    %eax, (%esp)  
    8. call    memset  
    9. leave  
    10. ret  


    通过汇编代码可以看出,{0}初始化方式,调用了memset函数!

     

    对三种方法的选取:

    1、for 最浪费时间,不建议(其实memset内部也是用循环实现的,只不过memset经过了严格优化,所以性能更高);

    2、{0} 可能有移植性问题,虽然绝大多数编译器看到{0} 都是将数组全部初始化为0, 但是不保证所有编译器都是这样实现的;

    3、综合1、2, 推荐使用memset方法。

     

    附录:对于{0}初始化的测试

     

    这是很基础的东西,但基础的重要性不言而喻,我敢肯定这个知识点我肯定曾经了解过,但现在,我不敢确定,由此可见纪录的重要性,这世界没有什么捷径,找对方向,然后不停重复.所以从今天开始,我会比较详细的纪录这些比较小的知识点,其实还是有不少有意思的地方的.


        写这篇文章的起因在于<<COM技术内幕>>第七章新东西太多,看的我目不暇接,所以在网上找了些例子看,其中就有一个例子中出现了这样的语句: 

    ...
    wchar_t wname[128]={0};
    char cname[256]={0};
    ...

    我感兴趣的是:
    1.这种赋值的结果.
    2.这种形式是否符合标准编码规则?

    我找到了如下资料,可能有助于对这个知识点的掌握.

    /*
    初始化值的个数可少于数组元素个数.当初始化值的个数少于数组元素个数时,前面的按序初始化相应值, 后面的初始化为0(全局或静态数组)或为不确定值(局部数组).
    */

     

    我相信上面的资料是C和C++语言的标准规范,但实际编译器处理时,可能会和规范有所不同.因为编译器原则上要遵从语言规范,但对于局部数组的不确定值到底是多少,怎么处理,编译器就可以灵活处理.我测试了三种编译器,其实编译器赋予的值是固定的,都是0.

    在这篇blog中 http://hi.baidu.com/widebright/blog/item/a024bc09631402256b60fbd0.html 谈论了相同的话题,现对其摘录如下: 

    /*
    一直以为 int a[256]={0};是把a的所有元素初始化为0,int a[256]={1};是把a所有的元素初始化为1.
    调试的时查看内存发现不是那么一回事,翻了一下《The C++ Programming Language》总算有定论。PDF的竟然不然复制,就把它这章翻译了,如下

    5.2.1   数组初始化 
    数组可以用一个列值来初始化,例如
             int v1[] ={1,2,3,4};
             char v2[]={'a','b','c',0};
    当数组定义时没有指定大小,当初始化采用列表初始化了,那么数组的大小由初始化时列表元素个数决定。所以v1和v2分别为 int[4] 和char[4]类型。如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误。例如:
             char   v3[2] ={'a','b',0};   //错误:太多的初始化值了
             char   v3[3] ={'a','b',0};   //正确

    如果初始化时指定的的元素个数比数组大小少, 剩下的元素都回被初始化为   0。例如
             int   v5[8]={1,2,3,4};
    等价于
              int   v5[8]={1,2,3,4,0,0,0,0};

    注意没有如下形式的数组赋值:
             void f()
             {
                 v4={'c','d',0};   //错误:不是数组赋值
             }
    如果你想这样的复制的话,请使用 vector(16章第三节) 或者 valarray(22章第四节)。
            字符数组可以方便地采用字符串直接初始化(参考第五章 2.2小节)
             译注: 就是 这样啦   char   alpha []="abcdefghijklmn";

    */

     

    下面来看一个例子:

    #include <iostream.h>

    int array1[5]={1,2,3};
    static int array2[5]={1};


    void main()
    {
        int arr1[5]={2};
        static int arr2[5]={1,2};
        
        int n;
        cout <<"global: ";
        for(n=0; n<5; n++)
            cout <<" " <<array1[n];
        
        cout <<" global static: ";
        for(n=0; n<5; n++)
            cout <<" " <<array2[n];
        
        cout <<" local: ";
        for(n=0; n<5; n++)
            cout <<" " <<arr1[n];
        
        cout <<" local static: ";
        for(n=0; n<5; n++)
            cout <<" " <<arr2[n];
        cout <<endl;
    }

    在这个例子中,全局和静态数组都按语言规范要求被初始化为0,但是局部数组并没有向前面所说的为不确定值,下面是用gcc,VC6.0,tuborC++分别编译的结果(注意gcc用g++编译c++文件,gcc不会链接库的):

    /*
    GCC 可同时用来编译 C 程序和 C++ 程序。一般来说,C 编译器通过源文件的后缀名来判断是 C 程序还是 C++ 程序。在 Linux 中,C 源文件的后缀名为 .c,而 C++ 源文件的后缀名为 .C 或 .cpp。
        但是,gcc 命令只能编译 C++ 源文件,而不能自动和 C++ 程序使用的库连接。因此,通常使用 g++ 命令来完成 C++ 程序的编译和连接,该程序会自动调用 gcc 实现编译。
    */

     

    GCC:

     


     

    VC6.0:


     

    TurboC++

     


     

        这说明了对局部数组没有初始化的元素的值,这几种编译器都将其设置为0.但是,如果如果不对数组进行初始化,即在定义的同时没有用列表初始化,那么局部数组的值就取决于编译器而对程序员来说就是不可预料的了.有时间可以测试一下各个编译器,不过在vc中是0xcc.所以对局部数组的初始化要特别小心.但是全局的数组和静态数组还是会被正确的赋于0值的.

        最后要重申下对变量初始化的重要性, http://blog.vckbase.com/smileonce/archive/2005/06/18/6777.html  这里列举了没有初始化造成的事故.

        此外,这个blog地址值得收藏,在http://blog.vckbase.com/ 排行榜的blog都值得仔细看.

    展开全文
  • 今天小编就为大家分享一篇C语言不定长数组初始化方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 我们在使用c语言对数组进行初始化的时候往往比较扎心要么使用对索引进行赋值要么使用memset进行分段的赋值,现在我学习到一种方法可以随意的对数组进行初始化。int array[20]={[0 ... 5]=8,[6 ... 11]=12,[12 ... 19...
  • C语言数组初始化问题

    千次阅读 2015-03-31 12:22:37
    最近在复习C语言,然后做题时突然想到了数组初始化问题,然后查阅资料了解到结论:全局和静态数组都按语言规范要求被初始化为0 对于局部数组初始化元素个数少于数组元素个数时,数组前面的元素值对应初始化值,...
  • C语言数组初始化全部为0

    千次阅读 2014-03-07 17:13:35
    第一种,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋给其余的元素。如果没有给出初始值,编译器不会去做初始化工作。这样简洁的方式让代码更加高效。   还有一种,就是memcpy函数的使用。例如上面...
  • C语言数组初始化

    千次阅读 2018-07-06 15:25:45
    C语言数组初始化  这是很基础的东西,但基础的重要性不言而喻,我敢肯定这个知识点我肯定曾经了解过,但现在,我不敢确定,由此可见纪录的重要性,这世界没有什么捷径,找对方向,然后不停重复.所以从今天开始,我会...
  • C语言数组初始化表示方法

    万次阅读 多人点赞 2019-07-25 10:51:22
    一、C语言一维数组初始化: (1)在定义数组时对数组元素赋以初值。如: static int a[10]={0,1,2,3,4,5,6,7,8,9}; 经过上面的定义和初始化后,a[0]=0,a[1]=1,… ,a[9]=9。 (2)初始化时可以只...
  • C语言字符数组初始化

    2013-03-31 18:27:58
    C语言字符数组初始化
  • C语言数组指定初始化

    千次阅读 2018-05-13 12:44:13
    利用该特性可以初始化指定的数组元素。例如,只初始化数组中的最后一个元素。对于传统的的C初始化语法,必须初始化最有一个元素之前的所有与还俗,才能初始化它:int arr[6]={0,0,0,0,0,212];//传统的语法而使用C99...
  • C语言数组初始化总结

    万次阅读 多人点赞 2017-12-28 10:40:06
    本人第一次发表微博 ,所发内容大部分来自对博友的发表微博的总结,程序是亲自测试过的,如果内容有不对或者不严谨的地方,请高手不吝指教。...(2) 数组初始化:程序员至少必须把数组元素的第一个数组元素初始化为
  • c语言数组初始化问题

    2021-10-22 07:27:54
    c语言数组为什么要去初始化,系统不是会自动初始化为0吗?
  • C语言 数组指针初始化

    千次阅读 2020-06-20 10:41:03
    当然不行,不管从初始化器,还是从原理上来讲都不正确,首先a[3][4]表示的是数组中第4行第5个元素,请问,可以对数组中具体的一个元素赋这么长一串值吗?所以不能这样赋值。第一种写法是属于初始化初始化会自动...
  • 一维数组初始化 一维数组的初始化可以使用以下方法实现: 1) 定义数组时给所有元素赋初值,这叫“完全初始化”。例如: int a[5] = {1, 2, 3, 4, 5}; 通过将数组元素的初值依次放在一对花括号中,如此初始化之后...
  • C语言结构体数组初始化 一、使用场景 在C编码中,经常需要对结构体数组进行初始化。 使用这种方法,能够使得代码更加的清晰,易读。 例如:需要根据返回码,一个status code 做不同的操作。 int process_by_status...
  • 一、初始化 方法 1 int a[5]={1,2,3,4,5}; 方法 2 int b[]={6,7,8,9,10}; 方法 3 int c[5]; //必须定义大小,否则报错 c[0]=11; c[1]=12; c[2]=13; c[3]=14; c[4]=15; 二、计算数组元素个数 int len=...
  • C语言数组的默认初始

    千次阅读 2020-08-05 17:24:31
    int s[5]; void main() { printf("%d\n",s[0]); printf("%d\n",s[1]); printf("%d\n",s[2]); printf("%d\n",s[3]); printf("%d\n",s[4]);... } SO,1 全局int数组默认值0, 非全局数组初值是乱七八糟值
  • 这个问题一直困扰了我很久,我向来都用for来控制置-1;因为我不会用memset(つ﹏⊂)我是个蒟蒻。... 建立数组的时候同时完成初始化,如果是静态创建数组那么只能将数组初始化为0;  1 int arr[10] = {0};...
  • C语言数组初始化为一个数字的技巧

    千次阅读 多人点赞 2020-01-10 15:25:30
    C语言中,当我们使用数组的时候,我们或许会希望数组一开始全部被赋予某个特殊的值,我们该怎么做呢? 1.全部赋值为0 int main() { int c[5]={0};//这种办法很简便,但好像只对赋值为 0 才有效,其它的数字都只...
  • C语言多维数组初始化

    千次阅读 2019-05-28 13:41:00
    由于剧情,需要C语言实现图像算法。但作为一名MATLAB老用户,根本不知“指针”“内存”为何物。开始自信满满,结果连初始化一个二维全零矩阵都不会(尴尬)。 顾从零学起,在此总结,供跟我一样的选手学习交流。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 143,028
精华内容 57,211
关键字:

c语言数组初始化

c语言 订阅