我的一个朋友正在开始他的编程/ 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没有初始化,默认设置为一个非常大的整数,所以他的数组有一个非常大的容量...但经过一些调试我不太确定。
那么这是如何工作的呢?
编辑:我知道这是错的。我知道他应该使用矢量。但是这段代码正在运行。输出值有效。我只是想从技术上知道这件事是如何运作的。
答案 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
中的值。 并更糟糕的是,如果您使用了足够大的索引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;
}
最终输出为tableau[0] = 666
,注意我们没有直接写入。
这是在Microsoft visual studio中编译的。
以下是在Codepad.org上运行的示例,其中moyenne被覆盖: http://codepad.org/Y1JMC8V5