初探C++数组的size可以是变量

简介:   在教材中,关于数组的声明,格式要求是“类型标识符 数组名[常量表达式]”,是的数组的大小,数组的size,强调一定是变量。看过不少的书,都在强调一定要用常量,或者用成const定义的常变量,总之,在声明数组,分配存储空间的时候,size一定是确定的,并且保证以后再不改动。  在辅导学生时,他编的程序中,声明数组居然用变量作size,且错误不在此处。怎么可能?可这是事实。  用下面的简单

  在教材中,关于数组的声明,格式要求是“类型标识符 数组名[常量表达式]”,是的数组的大小,数组的size,强调一定是变量。看过不少的书,都在强调一定要用常量,或者用成const定义的常变量,总之,在声明数组,分配存储空间的时候,size一定是确定的,并且保证以后再不改动。

  在辅导学生时,他编的程序中,声明数组居然用变量作size,且错误不在此处。怎么可能?可这是事实。

  用下面的简单示例说明,这种程序在CodeBlocks中是可以通过编译的(但在VC++6.0中错误):

#include <iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int a[n];
    for(int i=0; i<n; i++)
        cin>>a[i];
    for(int i=0; i<n; i++) 
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}
  回家后查各种书,《C++ Primer》还在强调一定是常量表达式,其他书上要么也这么说,要么不强调是常量还是变量。WalterSavitch的《C++程序设计(第8版)》中讲到“数组长度使用变量,对大多数编译器是非法的。”在举例中提到“有的编译(但并非全部)允许用变量指定数组长度。但是为了移植性,不应该这样做,即使目前所用的编译器允许。”

  从网上,有人谈到这是从C++99开始增加的新定义。是新的语法特性,多数编译器根本不支持。

  作为更新很快的CodeBlocks,支持新标准很正常。

  对于这种新语法,试图掌握些规律。用下面的一段程序作为调试,考查变量的值发生变化之后,以及再发生内存分配之后会不会覆盖之类的问题。

#include <iostream>
using namespace std;
int main()
{
    int n;
    n=3;
    int a[n];
    for(int i=0; i<n; i++)
        cin>>a[i];
    for(int i=0; i<n+5; i++)
        cout<<a[i]<<" ";
        cout<<endl;
    n=6;
    for(int i=3; i<n; i++)
        cin>>a[i];
    for(int i=0; i<n+2; i++)
        cout<<a[i]<<" ";
                cout<<endl;
    int b[n];
    for(int i=0; i<n; i++)
        cin>>b[i];
    for(int i=0; i<n+2; i++)
        cout<<a[i]<<" ";
                cout<<endl;
    cout<<endl;
    return 0;
}

  程序运行,总体没有发现什么异常,但这并不足以说明程序没有问题,这样做不会出问题。而且,CodeBlocks中对于越界访问也没有加限制,似乎是件好事,但可能就是坏事。这倒是提醒我们,在利用数组时,更加多几份小心了。现在政府职能转变是个热点话题,权力意味着责任,限制少了,不会老卡在编译错误上,但为了保证程序能够安全运行,编程者应该把关更多。

  还没有完全搞明白这件事情。但变量作数组声明中的长度,还是少用。如果要使用动态调整大小的数组,明着来,用动态数组或者C++中提供的Array对象,这种影响可移植性的代码,还是少写。

  如果以后有闲,倒是可以考察下当初标准为何要做出这样的调整。调整,意味着有些道理,有机会知道下,还是件不错的事。

 

 

 


目录
相关文章
|
2月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
78 4
|
1月前
|
C语言 C++
实现两个变量值的互换[C语言和C++的区别]
实现两个变量值的互换[C语言和C++的区别]
17 0
|
2月前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
3月前
|
存储 安全 C++
C++:指针引用普通变量适用场景
指针和引用都是C++提供的强大工具,它们在不同的场景下发挥着不可或缺的作用。了解两者的特点及适用场景,可以帮助开发者编写出更加高效、可读性更强的代码。在实际开发中,合理选择使用指针或引用是提高编程技巧的关键。
33 1
|
3月前
|
算法 C++
c++学习笔记04 数组
这篇文章是C++学习笔记4,主题是数组。
42 4
|
2月前
|
JavaScript 前端开发 Java
通过Gtest访问C++静态、私有、保护变量和方法
通过Gtest访问C++静态、私有、保护变量和方法
63 0
|
3月前
|
C++ 索引
C++数组、vector求最大值最小值及其下标
C++数组、vector求最大值最小值及其下标
111 0
|
4月前
|
C++ 索引 运维
开发与运维数组问题之在C++中数组名和指针是等价如何解决
开发与运维数组问题之在C++中数组名和指针是等价如何解决
29 6
|
4月前
|
存储 安全 C++
开发与运维数组问题之声明一个数组如何解决
开发与运维数组问题之声明一个数组如何解决
44 6
|
4月前
|
存储 C++ 容器
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
53 5