精华内容
下载资源
问答
  • 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语言中,数组初始化的方式主要有三种:1、声明时,使用 {0} 初始化;2、使用memset;3、用for循环赋值。那么,这三种方法的原理以及效率如何呢? 请看下面的测试代码:#defineARRAY_SIZE_MAX(1*1024*1024)void...

    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[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方法。

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

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

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

    4af4909a7a14a73b5ae25f05b30d37cc.gif...

    ed82d24458c749bcd0e3e029c65b0c9d.gifwchar_t wname[128]={0};

    ed82d24458c749bcd0e3e029c65b0c9d.gifchar cname[256]={0};

    4af4909a7a14a73b5ae25f05b30d37cc.gif...

    我感兴趣的是:

    1.这种赋值的结果.

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

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

    ed82d24458c749bcd0e3e029c65b0c9d.gif/*

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

    8663ef629a0eca4ceb34aa0f98cb6888.gif*/

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

    ed82d24458c749bcd0e3e029c65b0c9d.gif/*

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

    a385edd1f1424902bd26b3dfedb9014c.gif调试的时查看内存发现不是那么一回事,翻了一下《The C++ Programming Language》总算有定论。PDF的竟然不然复制,就把它这章翻译了,如下

    a385edd1f1424902bd26b3dfedb9014c.gif

    a385edd1f1424902bd26b3dfedb9014c.gif5.2.1   数组初始化 

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

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

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

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

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

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

    a385edd1f1424902bd26b3dfedb9014c.gif

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

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

    a385edd1f1424902bd26b3dfedb9014c.gif等价于

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

    a385edd1f1424902bd26b3dfedb9014c.gif

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

    a385edd1f1424902bd26b3dfedb9014c.gif         void f()

    a385edd1f1424902bd26b3dfedb9014c.gif         {

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

    a385edd1f1424902bd26b3dfedb9014c.gif         }

    a385edd1f1424902bd26b3dfedb9014c.gif如果你想这样的复制的话,请使用 vector(16章第三节) 或者 valarray(22章第四节)。

    a385edd1f1424902bd26b3dfedb9014c.gif        字符数组可以方便地采用字符串直接初始化(参考第五章 2.2小节)

    a385edd1f1424902bd26b3dfedb9014c.gif         译注: 就是 这样啦   char   alpha []="abcdefghijklmn";

    a385edd1f1424902bd26b3dfedb9014c.gif

    8663ef629a0eca4ceb34aa0f98cb6888.gif*/

    下面来看一个例子:

    4af4909a7a14a73b5ae25f05b30d37cc.gif#include 

    4af4909a7a14a73b5ae25f05b30d37cc.gif

    ed82d24458c749bcd0e3e029c65b0c9d.gifint array1[5]={1,2,3};

    ed82d24458c749bcd0e3e029c65b0c9d.gifstatic int array2[5]={1};

    4af4909a7a14a73b5ae25f05b30d37cc.gif

    4af4909a7a14a73b5ae25f05b30d37cc.gif

    4af4909a7a14a73b5ae25f05b30d37cc.gifvoid main()

    ed82d24458c749bcd0e3e029c65b0c9d.gif{

    d802a6ed7ce3e0100c571679253359ce.gif    int arr1[5]={2};

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

    a385edd1f1424902bd26b3dfedb9014c.gif    

    a385edd1f1424902bd26b3dfedb9014c.gif    int n;

    a385edd1f1424902bd26b3dfedb9014c.gif    cout <

    a385edd1f1424902bd26b3dfedb9014c.gif    for(n=0; n<5; n++)

    a385edd1f1424902bd26b3dfedb9014c.gif        cout <

    a385edd1f1424902bd26b3dfedb9014c.gif    

    a385edd1f1424902bd26b3dfedb9014c.gif    cout <

    a385edd1f1424902bd26b3dfedb9014c.gif    for(n=0; n<5; n++)

    a385edd1f1424902bd26b3dfedb9014c.gif        cout <

    a385edd1f1424902bd26b3dfedb9014c.gif    

    a385edd1f1424902bd26b3dfedb9014c.gif    cout <

    a385edd1f1424902bd26b3dfedb9014c.gif    for(n=0; n<5; n++)

    a385edd1f1424902bd26b3dfedb9014c.gif        cout <

    a385edd1f1424902bd26b3dfedb9014c.gif    

    a385edd1f1424902bd26b3dfedb9014c.gif    cout <

    a385edd1f1424902bd26b3dfedb9014c.gif    for(n=0; n<5; n++)

    a385edd1f1424902bd26b3dfedb9014c.gif        cout <

    a385edd1f1424902bd26b3dfedb9014c.gif    cout <

    8663ef629a0eca4ceb34aa0f98cb6888.gif}

    4af4909a7a14a73b5ae25f05b30d37cc.gif

    4af4909a7a14a73b5ae25f05b30d37cc.gif

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

    ed82d24458c749bcd0e3e029c65b0c9d.gif/*

    a385edd1f1424902bd26b3dfedb9014c.gifGCC 可同时用来编译 C 程序和 C++ 程序。一般来说,C 编译器通过源文件的后缀名来判断是 C 程序还是 C++ 程序。在 Linux 中,C 源文件的后缀名为 .c,而 C++ 源文件的后缀名为 .C 或 .cpp。

    a385edd1f1424902bd26b3dfedb9014c.gif    但是,gcc 命令只能编译 C++ 源文件,而不能自动和 C++ 程序使用的库连接。因此,通常使用 g++ 命令来完成 C++ 程序的编译和连接,该程序会自动调用 gcc 实现编译。

    8663ef629a0eca4ceb34aa0f98cb6888.gif*/

    GCC:

    L3Byb3h5L2h0dHAvcC5ibG9nLmNzZG4ubmV0L2ltYWdlcy9wX2Jsb2dfY3Nkbl9uZXQvc2lieWxsZS90Mi5qcGc=.jpg

    VC6.0:

    L3Byb3h5L2h0dHAvcC5ibG9nLmNzZG4ubmV0L2ltYWdlcy9wX2Jsb2dfY3Nkbl9uZXQvc2lieWxsZS90My5qcGc=.jpg

    TurboC++

    L3Byb3h5L2h0dHAvcC5ibG9nLmNzZG4ubmV0L2ltYWdlcy9wX2Jsb2dfY3Nkbl9uZXQvc2lieWxsZS90MS5qcGc=.jpg

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

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

    c语言数组初始化问题

    2147483648字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素. charstr[10]={'I','','a','m','',‘h’,'a','p','p','y'}; 即把10 ...

    js数组去重的三种常用方法总结

    第一种是比较常规的方法 思路: 1.构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比 3.若结果数组中没有该元素,则存到结果数组中   Array.p ...

    c语言数组初始化 蛋疼

    一个一般性的结论 int a[100]={N}//N是一个大于等于0的整数 以上代码只会把a[0]初始化为N,其它内存单元都会被初始化为0 int a[100]={5} 这行代码它只会把a[0]初始化 ...

    C语言数组初始化

    例如: int a[15] = {0}; 第一种,编译器会把第一个初始化值赋给数组的第一个元素,然后用0赋给其余的元素.如果没有给出初始值,编译器不会去做初始化工作.这样简洁的方式让代码更加高效. 还 ...

    C语言数组初始化全部为0

    ] = {}; 编译器会把第一个初始化值(这里是0)赋给数组的第一个元素,然后用默认值0赋给其余的元素.如果没有给出初始值,编译器不会去做初始化工作.这样简洁的方式让代码更加高效. 另一种,就是mem ...

    javascript数组去重的三种常用方法,及其性能比较

    在进行数组操作时往往会遇到去掉重复项的问题,下面简单介绍下数组去重的方法,以及其执行效率 方法一        采用两次循环        原理:拿当前的和他后面的比,如果后面的有重复的就干掉     ...

    09-C语言数组

    目录: 一.使用xcode编辑工具 二.数组 三.数组遍历 四.多维数组 回到顶部 一.使用xcode编辑工具 1 打开xcode程序 2 创建一个项目 OSX -> Application - ...

    c语言数组不同初始化方式的结果

    第一种初始化方式: #include int main() { int numbers[5]={12,14}; for (int i=0; i<5; i++) { ...

    随机推荐

    安装linxu6&period;4

    RHEL6.3系统安装 进入安装界面 这里选择跳过 点击下一步 选择安装语言 选择键盘 选择系统储存方式 选择是否格式化储存设备 给安装的系统一个计算机名 选择时区 给root一个密码 可以忽略或给一 ...

    webgl动画小测试

    // MultiPoint.js (c) 2012 matsuda // Vertex shader program var VSHADER_SOURCE = 'attribute vec4 a_Po ...

    caffe中关于数据进行预处理的方式

    caffe的数据层layer中再载入数据时,会先要对数据进行预处理.一般处理的方式有两种: 1. 使用均值处理 transform_param { mirror: true crop_size: me ...

    初识WebSocket协议

    1.什么是WebSocket协议 RFC6455文档的表述如下: The WebSocket Protocol enables two-way communication between a clie ...

    获取不到app&period;config里面的数据库连接字符串的解决方法

    今天在自己的类库里添加了对app.config文件的数据库连接字符串的引用,但是返回的居然是Null,纳闷了.然后在网上找到了答案原来是我的app.config文件加错了地方,应该加到启动项目里面,而 ...

    【转】MAC使用adb工具

    原文网址:http://www.jeffjade.com/2015/03/21/2015-03-21-android-adb/ 前阵子入手了一本MacPro后,终将阵地也转移到了这里.但是Mac默认不 ...

    51nod动态规划-----矩阵取数

    一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值. 例如:3 * 3的方格. 1 3 3 2 1 3 2 2 1 能够获得的最 ...

    AD DIV 层的知识 和 行为特效

    1.AP(绝对定位) 2.使用AP DIV层和表格结合起来完美布局网页 3.层的Z轴值越大,该层就位于比较顶的位置 4.层有可见性的属性,层溢出,层的裁剪, 5层嵌套,先把光标定位在外层里面,然后拖多 ...

    初识Selenium(四)

    用Selenium实现页面自动化测试 引言 要不要做页面测试自动化的争议由来已久,不做或少做的主要原因是其成本太高,其中一个成本就是自动化脚本的编写和维护,那么有没有办法降低这种成本呢?童战同学在其博 ...

    mac搭建简单的hls推流服务器遇到的问题&lpar;待更新&rpar;

    实际操作步骤: 输入brew install nginx-full --with-rtmp-module命令出现以下报错: 需要先安装nginx服务器,运行命令brew tap homebrew/ng ...

    展开全文
  • 数组赋值初始化的三个方式 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语言数组带下标赋值

    2020-11-17 23:55:21
    c语言数组带下标赋值初始化的时候数组元素的值不受顺序影响,在有些时候方便扩展一幕了然。 int array[3] = { 1, 2, 3 }; /* 等同于 */ int array[3] = { [0] = 1, [1] = 2, [2] = 3, }; int array[3] = { [2]...
  • C语言数组赋值方法数组赋值的方法分为:1.赋值语句--对数组元素逐个赋值例:#include int main(){int i,a[10];for(i = 0;i <=9;i++){a[i]=i; /*赋值语句*/}for(i = 9;i >=0;i--){printf("%d",a[i]);}return 0...
  • C语言 数组初始化的三种常用方法({0}, memset, for循环赋值)以及原理 C语言中,数组初始化的方式主要有三种: 1、声明时,使用 {0} 初始化; 2、使用memset; 3、用for循环赋值。 那么,这三种方法的原理...
  • C语言数组初始化方式

    2013-03-31 23:42:00
    C语言的数组记得初始化这个是比较好的习惯,对于全局数组来说如果没有初始化的话一般是会被赋值成0值,但是对于局部数组来说则是要看操作系统和编译器而定,所以是不确定的,所以一定要记得数组初始化,防止因此出现...
  • 我们在使用c语言对数组进行初始化的时候往往比较扎心要么使用对索引进行赋值要么使用memset进行分段的赋值,现在我学习到一种方法可以随意的对数组进行初始化。int array[20]={[0 ... 5]=8,[6 ... 11]=12,[12 ... 19...
  • 在C++中对于以下语句:// 全局域int i = 3;int j = i;编译时将i放入.data段,设置其值为3。而对于j,编译器遇到...编译器不能够直接用3来初始化j,因为计算机不是人,不懂简单的人类逻辑,我们想“因为i = 3,而j ...
  • 我想问一问大神, 比如说 我有一个数组a[2],a[0]=1,a[1]=2; 我想重新给它赋值,没有初始化数组 我直接a[0]=2,a[1]=3,这样是不是有问题
  • 经过yulinlang的提醒,我翻阅了K&R数组初始化(4.9)节,早已说过 ——如果初始化表达式的个数比数组元素少,则对外部变量、静态变量和自动变量来说,没有初始化的表达式的元素将被初始化为0。 全文请看 这里 ...
  • 初学数组,以华科的《c 语言与程序设计》为教材,参考了《一站式学习c编程》,后者数组一章有串代码如下int main(void){int i, histogram[10] = {0};gen_random(10);for (i = 0; i < N; i++)histogram[a[i]]++;.....
  • 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语言中的结构体,结构体中数组初始化赋值

    万次阅读 多人点赞 2018-01-03 10:18:33
    最近写c语言中的结构体遇到了些问题,从网上找了些资料如下: 结构体是连续存储的,但由于结构体中成员类型各异,所以会存在内存对齐问题,也就是内存里面会有空档,...结构体是可以直接初始化的,在定义的时候,就可
  • (1)charstr[10]={'I','','a','m','','h','a','p','p...若小于数组长度,则只将这些字符数组中前面赋值,其余的元素自动定位空字符(即'\0');若刚好相等,可以使用strlen等函数,此时会自动在最后加上'\0'(自测试)。(...
  • C语言数组初始化总结

    万次阅读 多人点赞 2017-12-28 10:40:06
    本人第一次发表微博 ,所发内容大部分来自对博友的发表微博的总结,程序是亲自测试过的,如果内容有不对或者不严谨的地方,请高手不吝指教。...(2) 数组初始化:程序员至少必须把数组元素的第一个数组元素初始化为
  • 一维数组的定义方式如下:类型说明符 数组名[常量表达式];例如:int a[5];它表示定义了一个整型数组,数组名为 a,定义的数组称为数组 a。此时数组 a 中有 5 个元素,每个元素都是 ...一维数组初始化一维数组的初始...
  • C语言 数组指针初始化

    千次阅读 2020-06-20 10:41:03
    当然不行,不管从初始化器,还是从原理上来讲都不正确,首先a[3][4]表示的是数组中第4行第5个元素,请问,可以对数组中具体的一个元素赋这么长一串值吗?所以不能这样赋值。第一种写法是属于初始化初始化会自动...
  • C语言数组初始化为一个数字的技巧

    千次阅读 多人点赞 2020-01-10 15:25:30
    C语言中,当我们使用数组的时候,我们或许会希望数组一开始全部被赋予某个特殊的值,我们该怎么做呢? 1.全部赋值为0 int main() { int c[5]={0};//这种办法很简便,但好像只对赋值为 0 才有效,其它的数字都只...
  • 1.首先定义结构体数组: typedef struct BleAndTspRmtCmd{ char terminal[3]; char note[3]; char rmtCmd[10]; char cmdPropt[24];}; BleAndTspRmtCmd为结构体名,可以通过这个结构体名定义其他结构体变量,...
  • 1.首先定义结构体数组:typedef struct BleAndTspRmtCmd{char terminal[3];char note[3];char rmtCmd[10];char cmdPropt[24];};BleAndTspRmtCmd为结构体名,可以通过这个结构体名定义其他结构体变量,...
  • C语言字符数组初始化教程C语言字符数组初始化一参数char arrName[count] = {'val1', 'val2', 'val3', ....};说明我们可以在 {} 写上一系列的值,用来初始化字符数组的值。C语言字符数组初始化二语法#include char ...
  • c语言数组介绍

    万次阅读 热门讨论 2021-08-13 09:13:39
    文章目录一、一维数组的创建和初始化1.数组的创建2.数组初始化3.一维数组的使用4.一维数组在内存中的存储二、二维数组的创建和初始化1.二维数组的创建2.二维数组的创建3.二维数组的创建4.二维数组在内存中的存储二...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,642
精华内容 29,456
关键字:

c语言数组初始化赋值

c语言 订阅