[自用2.]C++杨辉三角

完整代码

#include <iostream>
#include <iomanip>

using namespace std;

#define num 5

int main(){
    
    //cout<<"请输入需要输出的行数:"<<endl;
    //cin>>num;
    int box[num][num]={0};

    for(int i=0;i<num;i++){
        cout<<setw(2*(num-i));
        for(int j=0;j<=i;j++){
            if(j==0||j==i+1){
                box[i][j]=1;
            }else{
                box[i][j]=box[i-1][j]+box[i-1][j-1];
            }
            if(j==0){
                cout<<box[i][j];
            }else{
                cout<<setw(4)<<box[i][j];
            }
            if(j==i){
                cout<<endl;
            }
        }
    }
}

这段代码中输入杨辉三角的行数需要是固定的,如果使用下面的代码进行定义,会出现输出乱码的情况。经过测试,使用全局变量不会出现乱码问题。

int num=5;
int box[num][num];

给出下列解释

在C++中,使用变长数组(Variable Length Array,VLA)来定义二维数组时,即使用类似 `int box[num][num];` 的形式,是一种非标准的语法。在标准C++中,数组的大小必须在编译时就已知且是常量表达式,因此使用变长数组是不被推荐的,并且在某些编译器中甚至可能会导致不可预测的行为,如乱码或崩溃。

### 为什么会出现乱码现象?

1. **编译时数组大小问题:** 
   - C++标准要求数组的维度必须是常量表达式,而不是变量。因此,`int box[num][num];` 这种形式在某些编译器上可能无法正确处理,因为编译器无法确定数组的确切大小。这可能导致内存访问错误,从而出现乱码或其他异常行为。

2. **全局变量和作用域问题:**
   - 如果将 `num` 声明为全局变量,它的作用域涵盖整个程序。这意味着在程序的其他部分也可以访问到 `num` 的值。在全局作用域中定义的数组,编译器可以更好地优化和分配内存,因为它能够在编译时确定数组的大小。

### 建议的解决方法:

- **使用常量表达式定义数组大小:** 
  - 将数组大小定义为常量表达式,如 `const int num = 5;` 或 `#define num 5`,这样编译器可以在编译时确定数组的确切大小,避免不确定性和乱码问题。

- **使用动态内存分配(new/delete 或 std::vector):**
  - 如果需要在运行时确定数组的大小,可以使用动态内存分配,如 `int** box = new int*[num];` 然后在每一行上分配内存。或者更推荐使用 `std::vector<std::vector<int>> box(num, std::vector<int>(num));`,这样可以安全地在运行时动态分配和管理内存,避免了静态数组大小不明确带来的问题。

- **全局变量的使用注意事项:**
  - 全局变量虽然可以解决作用域问题,但过度依赖全局变量可能会引入代码可维护性和可读性的问题。建议根据具体情况慎重考虑全局变量的使用。

总结来说,避免使用变长数组来定义二维数组,尤其是作为栈上的局部变量。正确的做法是使用常量表达式或动态内存分配来管理数组的大小和内存分配。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值