C ++动态数组初始化

时间:2013-08-14 20:08:18

标签: c++

我的一个朋友正在开始他的编程/ C ++之旅,所以我告诉他玩循环和数组。

他创建了一个简单的控制台程序来读取整数并计算平均值。

#include "stdafx.h"
#include <iostream>
#include <math.h>

using namespace std;
int largeurTab;
int nombre;
int affNombre = 1;
int tableau [] = {nombre};
float moyenne;


int _tmain(int argc, _TCHAR* argv[])
{
    //Saisi de la largeur du tableau
    cout << "Veuillez saisir la largeur desire pour le tableau!" << endl << "Largeur : ";
    cin >> largeurTab;

    //Saisi des nombres du tableau
    for (int i = 0; i < largeurTab; i++)
    {
        cout << endl << "Nombre " << affNombre << endl;
        cin >> nombre;
        tableau [i] = nombre;
        affNombre += 1;
    }

    //Affichage * pour ligne séparation
    for (int i = 0; i < 45; i++)
    {
        cout << "*";
    }

    cout << endl << "Voici le(s) nombre(s) que vous avez saisi :" << endl;

    affNombre = 1;
    //Affichage des nombres du tableau
    for (int i = 0; i < largeurTab; i++)
    {
        cout << endl << "Nombre " << affNombre << endl << tableau[i] << endl << endl;
        moyenne += tableau[i];
        affNombre += 1;
    }

    //Affichage * pour ligne séparation
    for (int i = 0; i < 45; i++)
    {
        cout << "*";
    }

    //Affichage et calcul de la moyenne des nombres saisi dans le tableau
    cout << endl << "La moyenne des nombres saisi est de : " << moyenne/largeurTab << endl;

    system("PAUSE");
    return 0;
}

我一直认为C ++数组是静态的,如果我想要动态的东西,我必须去寻找指针或向量等。Found this that kinda share the thoughts I have.

困扰我的部分是

int nombre;
int affNombre = 1;
int tableau [] = {nombre};

起初我认为既然nombre没有初始化,默认设置为一个非常大的整数,所以他的数组有一个非常大的容量...但经过一些调试我不太确定。

那么这是如何工作的呢?

编辑:我知道这是错的。我知道他应该使用矢量。但是这段代码正在运行。输出值有效。我只是想从技术上知道这件事是如何运作的。

4 个答案:

答案 0 :(得分:3)

int tableau [] = {nombre};

它不会声明具有 nombre 元素大小的数组。

它声明一个包含1个项目的数组,该数组初始化为nombre

答案 1 :(得分:2)

int nombre;
int affNombre = 1;
int tableau [] = {nombre};

这不会创建动态数组;它将指向数组的指针初始化为1.如果你的朋友想要学习C ++,我鼓励他们利用C ++结构(例如vector)。整个程序可以使用C ++构造在大约7行C ++中编写:

#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <vector>

int main()
{
    std::vector<int> v;
    std::cout << "Enter values to average (Ctrl+Z to finish):  ";
    std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter<std::vector<int>>(v));
    double result = std::accumulate(v.begin(), v.end(), 0.0) / v.size();
    std::cout.precision(8);
    std::cout << "Average = " << std::fixed << result;
    return 0;
}

答案 2 :(得分:1)

int nombre;
int affNombre = 1;
int tableau [] = {nombre};

上面的代码声明了“tableau”数组,大小为1,其值为nombre。

但是,我认为您使用以下代码来解决内存损坏问题

//Saisi des nombres du tableau
for (int i = 0; i < largeurTab; i++)
{
cout << endl << "Nombre " << affNombre << endl;
cin >> nombre;
tableau [i] = nombre;
affNombre += 1;
}

您有一个大小为1的数组表格。但是你正在为largeurTab循环并在tableau中插入那么多元素,但它只能合法地保存单个元素。所以你实际上遇到了缓冲区溢出。

祝你的程序运行正常。请使用vector作为已推荐的其他人或动态分配数组。

答案 3 :(得分:0)

这里发生的事情是tableau被视为一个指针,你正在写它指向的地方。

这是一篇关于变量如何在记忆中布局的文章:
http://www.geeksforgeeks.org/memory-layout-of-c-program/

在文章tableau中列出了“初始化数据”(仅因为它具有= {nombre};),它具有读写访问权限,这意味着如果他有多个全局初始化数组, tableau,让我们说foobar他可以通过写tableau覆盖foobar中的值。 更糟糕的是,如果您使用了足够大的索引tableaufoobar,则可以开始覆盖其他全局索引。

以下是foobar代写tableau的示例:

#include <iostream>
#include <math.h>

using namespace std;
int largeurTab;
int nombre = 0;
int affNombre = 1;
int tableau [] = {nombre};
int foobar [] = {nombre};
float moyenne;


int main(int argc, char* argv[])
{
    cout << "addrs of affNombre   " << &affNombre << endl;
    cout << "address of tableau   " << tableau << endl;
    cout << "address of foobar[1] " << &foobar[1] << endl;
    cout << "address of foobar    " << foobar << endl;
    cout << "address of moyenne   " << &moyenne << endl;

    foobar[1] = 666; // this is all evil
    cout << "foobar[0]  " << foobar[1] << endl;
    cout << "tableau[0] " << tableau[0] << endl;
    return 0;
}

最终输出为tableau[0] = 666,注意我们没有直接写入。

这是在Microsoft visual studio中编译的。

以下是在Codepad.org上运行的示例,其中moyenne被覆盖: http://codepad.org/Y1JMC8V5