C语言怎样定义变长数组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言怎样定义变长数组相关的知识,希望对你有一定的参考价值。

数组的长度可以用参数写入的
如char array[x];

”变长数组“确实是有的,是在C99标准才出现的。题主的写法没有错。变长指的就是可以用变量指定数组大小,而不是说数组大小可以在runtime改变。(”变长“这个这个翻译很怪啊.....)

写全的话应该是

int x = 2;   //x定义并赋值,当然不一定是2
char array[x];

测试了一下,这样的代码在VC6.0下会报错,因为对C99新标准没有很好地实现。VS2005也不行。VS2013可以正确编译。gcc 3.2.2也可以正确编译。

参考技术A 没办法定义 ”变长数组“
char array[x];

x的值 在定义(分配空间时)必须指明 或者程序能得到x的值。

变长数组 基本实现思路是
申请一块内存 可存放x个元素 当元素的个数大于x后增加x/n个元素空间(可以使用内存复制)
参考技术B int i=3;
char *ch=new char[i];

参考技术C 数组对长度要求是静态的。全局数组在系统初始化时在数据段为其分配空间,如果数组大小不明确,数据段无法为其分配空间,因为还有别的数据需要在数据段分配空间;局部变量数组在创建函数调用栈时也要求数组指定大小,因为局部变量是在栈底分配空间的,如果数组大小不明,栈的后续增长就不知道从哪里开始了。

一般对于这种需求,都是临时根据需要申请动态内存来用。
参考技术D 可以这样
int x;
cin>>x;
char *array=new char[x];

通过自定义的 Array 类来实现变长数组

有些较老的编译器不支持 变长数组 ,例如 VC6.0、VS2010 等,这有时候会给编程带来不便,下面我们通过自定义的 Array 类来实现变长数组。具体的例子来说明显式定义拷贝构造函数的必要性。
#include <iostream>
#include <cstdlib>
using namespace std;

//变长数组类
class Array
public:
    Array(int len);
    Array(const Array &arr);  //拷贝构造函数
    ~Array();
public:
    int operator[](int i) const  return m_p[i];   //获取元素(读取)
    int &operator[](int i) return m_p[i];   //获取元素(写入)
    int length() const  return m_len; 
private:
    int m_len;
    int *m_p;
;

Array::Array(int len): m_len(len)
    m_p = (int*)calloc( len, sizeof(int) );


Array::Array(const Array &arr)  //拷贝构造函数
    this->m_len = arr.m_len;
    this->m_p = (int*)calloc( this->m_len, sizeof(int) );
    memcpy( this->m_p, arr.m_p, m_len * sizeof(int) );


Array::~Array() free(m_p); 

//打印数组元素
void printArray(const Array &arr)
    int len = arr.length();
    for(int i=0; i<len; i++)
        if(i == len-1)
            cout<<arr[i]<<endl;
        else
            cout<<arr[i]<<", ";
        
    


int main()
    Array arr1(10);
    for(int i=0; i<10; i++)
        arr1[i] = i;
    
   
    Array arr2 = arr1;
    arr2[5] = 100;
    arr2[3] = 29;
   
    printArray(arr1);
    printArray(arr2);
   
    return 0;

以上是关于C语言怎样定义变长数组的主要内容,如果未能解决你的问题,请参考以下文章

关于在C语言 声明带有一个变长数组参数的函数

究根源详解C语言变长数组

变长数组 - 转

变长数组(variable-length array,VLA)

通过自定义的 Array 类来实现变长数组

通过自定义的 Array 类来实现变长数组