zoukankan      html  css  js  c++  java
  • C语言有关数组的几点

    动态大小数组


    先来看一段代码:

    int n = 3;
        int a[n];
        int i;
        for(i=0;i<n;i++)
        {   
            a[i]=i;
            printf("%d
    ",a[i]);
        }

    我在声明数组a时,使用了一个变量n,这看起来似乎有问题,但是实际上C99中支持这种用法,gcc也支持这种用法,可以正常编译运行。这种用法实现了动态大小数组(运行时动态,一旦确定不再改变)。

    另外,如果一个数组的大小需要根据某一输入N的大小来确定,那该怎么办呢?

    #include <stdio.h>
    #include <stdlib.h>
    
    void main()
    {
        int n;
        int *a;
        int i;
        scanf("%d",&n);
        a = (int*)malloc(sizeof(int)*n);
        for(i=0;i<n;i++)
        {   
            a[i]=i;
            printf("%d
    ",a[i]);
        }   
        return;
    }

    上面这段代码中,数组a的大小依赖输入n,因此先将a声明为一个指针,在确定n的大小之后,使用malloc来为a分配内存。注意:上面代码中我没有free掉这段内存,实际使用中malloc之后应该在不使用这段内存时free!

    0长数组


    最近几次看到类似这样的结构体:
    typedef struct
    {
        int a;
        int b[0];
    }A;

    看到没,长度为0的数组!!!当然,这种奇怪的用法只在GNU C中合法,在很多很多GNU开源代码中都用到过这种用法。

    那么,为啥要设置一个0长的数组呢?为啥不声明一个指针:int *b?

    首先,来看看int *b时的情况。这种情况下,我们在分配内存时,必须分配两次;在释放内存时也必须显示为b释放一次,这样太麻烦。如果使用b[0],有哪些好处呢?我们可能使用下面的语句来分配内存:

    A *cc = (A *)malloc(sizeof(A)+len);

    因为0长数组b不占内存,因此我们可以通过变量len来把握分配内存的大小,进而实现长度可变的结构体。使用0长数组可以分配一段连续的内存,在释放时直接使用free(cc)一次性释放掉所有内存,简化了内存管理。但是,0长数组只能在结构体末尾。

     

  • 相关阅读:
    函数模板
    三次握手四次分手
    多态
    函数指针与多态
    继承和派生
    使用ntp 实现时间同步
    Hadoop之Mapreduce 程序
    hadoop学习笔记二
    hadoop学习笔记 一
    大数据知识和资料总结
  • 原文地址:https://www.cnblogs.com/jaletech/p/3675472.html
Copyright © 2011-2022 走看看