加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 使用常量长度时char []和new char []之间的差异

发布时间:2020-12-16 06:45:55 所属栏目:百科 来源:网络整理
导读:所以这似乎是一个广泛回答的问题,但我更感兴趣的是两者之间究竟发生了什么不同的内部结构. 除了第二个示例不仅创建内存,而且还创建指向内存的指针的事实,当发生以下情况时,内存中会发生什么: char a[5];char b* = new char[5]; 与我提出这个问题的原因更直
所以这似乎是一个广泛回答的问题,但我更感兴趣的是两者之间究竟发生了什么不同的内部结构.

除了第二个示例不仅创建内存,而且还创建指向内存的指针的事实,当发生以下情况时,内存中会发生什么:

char a[5];
char b* = new char[5];

与我提出这个问题的原因更直接相关,我该怎么做

const int len = 5;
char* c = new char[len];

但不是

const int len = 5;
char d[len]; // Compiler error

编辑应该提到我在VC上遇到这个编译错误(去图……)

1>.input.cpp(138) : error C2057: expected constant expression
1>.input.cpp(138) : error C2466: cannot allocate an array of constant size 0
1>.input.cpp(138) : error C2133: 'd' : unknown size

编辑2:应该发布我正在使用的确切代码.当使用运行时值计算动态分配的数组的常量长度时,会产生此错误.

假设random(a,b)在a和b之间返回一个int,

const int len1 = random(1,5);
char a[len1]; // Errors,since the value
              // is not known at compile time (thanks to answers)

const int len2 = 5;
char b[len2]; // Compiles just fine

解决方法

不同之处在于阵列的寿命.如果你写:

char a[5];

然后数组有一个它定义的块的生命周期(如果是的话)
在块范围中定义的,包含它的类对象(如果是的话)
在类范围内定义)或静态生命周期(如果它在命名空间中定义)
范围).如果你写:

char* b = new char[5];

,那么阵列有你想要的任何生命 – 你必须
明确终止其生命周期:

delete [] b;

关于你的上一个问题:

int const len = 5;
char d[len];

是完全合法的,应该编译.哪里有区别:

int len = 5;    //  _not_ const
char d[len];    //  illegal
char* e = new char[len];    //  legal

差异的原因主要是编译器技术和历史:在很早的时候,编译器必须知道长度命令将数组创建为局部变量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读