C++ C++;动态数组初始化

C++ C++;动态数组初始化,c++,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 _tm

我的一个朋友正在开始他的编程/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;
}
起初我认为,由于nombre没有初始化,它默认设置为某个非常大的整数,所以他的数组具有非常大的容量。。。但经过一些调试后,我不太确定这一点

那么这到底是如何运作的呢

编辑:我知道这是错误的。我知道他应该用向量。但是这个代码正在工作。输出值是有效的。我只是想知道技术上这东西是怎么工作的

int tableau [] = {nombre};
它不声明元素大小为nombre的数组

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

int nombre;
int affNombre = 1;
int tableau [] = {nombre};
它不声明元素大小为nombre的数组

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

int nombre;
int affNombre = 1;
int tableau [] = {nombre};
这不会创建动态数组;它将指向数组的指针初始化为1。如果你的朋友正在学习C++,我会鼓励他们利用C++的构造(例如,代码>矢量< /代码>)。整个程序可以用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;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
std::向量v;
标准::cout

这不创建动态数组;它将数组指针初始化为1。如果你的朋友正在学习C++,我鼓励他们利用C++的构造(例如,代码>矢量< /代码>)。这个程序可以用C++的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;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
std::向量v;
标准::cout
上面的代码声明了大小为1的“tableau”数组,其值为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;
}
//Saisi des nombres du tableau
对于(int i=0;i
然而,我认为下面的代码会导致内存损坏

//Saisi des nombres du tableau
for (int i = 0; i < largeurTab; i++)
{
cout << endl << "Nombre " << affNombre << endl;
cin >> nombre;
tableau [i] = nombre;
affNombre += 1;
}
//Saisi des nombres du tableau
对于(int i=0;icout这里发生的事情是,
tableau
被视为一个指针,您正在向它所指向的任何地方写入

下面是一篇关于变量如何在内存中布局的文章:

在文章中,
tableau
是在“初始化数据”中列出的(只是因为它有
={nombre};
)它具有读写访问权限,这意味着如果他有多个全局初始化数组,比如
tableau
,比如
foobar
,他可以通过写入
foobar
来覆盖
tableau
中的值,如果你对
tableau
使用足够大的索引,情况会更糟>foobar
您可以开始覆盖其他全局设置

下面是一个
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;
}
#包括
#包括
使用名称空间std;
国际大城市;
int nombre=0;
int affNombre=1;
int tableau[]={nombre};
int foobar[]={nombre};
莫延河;
int main(int argc,char*argv[])
{

cout这里发生的事情是,
tableau
被视为一个指针,您正在向它所指向的任何地方写入

下面是一篇关于变量如何在内存中布局的文章:

在文章中,
tableau
是在“初始化数据”中列出的(只是因为它有
={nombre};
)它具有读写访问权限,这意味着如果他有多个全局初始化数组,比如
tableau
,比如
foobar
,他可以通过写入
foobar
来覆盖
tableau
中的值,如果你对
tableau
使用足够大的索引,情况会更糟>foobar
您可以开始覆盖其他全局设置

下面是一个
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;
}
#包括
#包括
使用名称空间std;
国际大城市;
int nombre=0;
int affNombre=1;
int tableau[]={nombre};
int foobar[]={nombre};
莫延河;
int main(int argc,char*argv[])
{

cout这是大小为1的数组的初始化,第一个值与
nombre
相同(未初始化未定义值).事实上,我没有看更大的代码,只看片段。
nombre
是一个全局的,应该是零初始化的。但是输出是有效的。因此,值填充在“数组”中。未定义的行为是未定义的:)但是,如果你想看看它是如何“工作”的,请认真地说使用调试器逐步执行,并检查这些越界数组写入的实际位置。检查其他全局数组,以防它们恰好按顺序排列在内存中。它实际上不“工作”,它只是无法快速而明显地崩溃。读取或写入超过数组末尾的数据是不正确的。这是对大小为1的数组的初始化,第一个值与
nombre
(未初始化的未定义值)相同.事实上,我没有看更大的代码,只看片段。
nombre
是一个全局的,应该是零初始化的。但是输出是有效的。因此,值填充在“数组”中。未定义的行为是未定义的:)但是,如果你想看看它是如何“工作”的,请认真地说使用调试器逐步执行,并检查这些越界数组写入的实际位置。检查其他全局数组,以防它们恰好按顺序排列在内存中。它实际上不“工作”,它只是无法快速而明显地崩溃。读取或写入数组的末尾永远都是不正确的。是的,我当然知道这应该用向量或任何东西来完成。但它仍然在工作,因此我的问题。我知道这是错误的,但我是一个