C语言怎样定义变长数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言怎样定义变长数组相关的知识,希望对你有一定的参考价值。
数组的长度可以用参数写入的
如char array[x];
”变长数组“确实是有的,是在C99标准才出现的。题主的写法没有错。变长指的就是可以用变量指定数组大小,而不是说数组大小可以在runtime改变。(”变长“这个这个翻译很怪啊.....)
写全的话应该是
int x = 2; //x定义并赋值,当然不一定是2char 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语言怎样定义变长数组的主要内容,如果未能解决你的问题,请参考以下文章