不是此数组中的所有值都设置为0吗?

问题描述 投票:2回答:2

我本质上是试图创建一个数组,并让用户输入一个方矩阵。由于某些原因,并非所有值都设置为0,我不确定为什么。这是代码:

#include <iostream>

using namespace std;

int main()
{
    int row, col, n;
    cout<<"Enter a positive odd integer above 1:   ";
    cin>>n;
    int mgcsqre[n][n] = {0};
}
c++
2个回答
2
投票

首先,您应该知道可变长度的数组只是GCC扩展,不属于C或C ++标准。您可以看一下GCC docs

可变长度自动数组在ISO C99中是允许的,并且作为扩展GCC在C90模式和C ++中接受它们。这些数组是与其他任何自动数组一样声明,但长度为不是常量表达式存储在以下位置分配当包含声明退出。

因此,以下代码:

#include <iostream>

int main() {
    int n = 5;

    int mgcsqre[n][n] = { 0 };

    for (int i = 0; i < n; i++) {
        std::cout << std::endl;
        for (int j = 0; j < n; j++) {
            std::cout << mgcsqre[i][j] << " ";
        }
    }
}

将与GCC完美地编译,但是使用CLANG编译时将产生以下错误:

错误:可变大小的对象可能未初始化

现在,以上使用GCC编译的代码将产生以下结果:

0 32536 -1273401536 32536 -1270477024 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0 
0 0 0 0 0

为什么会输出一些垃圾值?因为行为是C ++标准本身未定义的。

如果您尝试在C中编译等效代码:

#include <stdio.h>

int main() {
    int n = 5;

    int mgcsqre[n][n] = { 0 };

    for (int i = 0; i < n; i++) {
        printf("\n");
        for (int j = 0; j < n; j++) {
            printf("%d ", mgcsqre[i][j]);
        }
    }

    return 0;
}

您将收到以下错误:

错误:可变大小的对象可能未初始化

由于:

C99§6.7.8[初始化]

要初始化的实体的类型应为未知数组大小或不是可变长度数组类型的对象类型。

所以,什么是初始化可变长度数组的正确方法?有两个选项:

  1. 使用memset

  2. 使用传统的for循环遍历所有元素并将其初始化为0


1
投票

永远不会读取数组的值。因此,无法观察它们是否被初始化。按照基本规则,只要不能观察到这些更改,就允许编译器更改程序的行为。因此,允许编译器不初始化数组。

P.S。该程序在C ++中格式错误,因为memset不是编译时间常数,因此不允许用作自动数组的大小。

© www.soinside.com 2019 - 2024. All rights reserved.