Votre premier cas crée un seul élément char
(1 octet) alors que votre deuxième cas crée 10 éléments consécutifs char
(10 octets). Cependant, votre accès au t(x)[100]='m'
n'est pas défini dans les deux cas. C'est-à-dire que vous demandez 100 octets après la position du pointeur, ce qui est probablement une donnée erronée. En d'autres termes, votre affectation de 'm' remplacera tout ce qui existe déjà, ce qui pourrait être des données d'un autre tableau. Ainsi, vous pouvez rencontrer des erreurs bizarres pendant l'exécution. C/C++ permet aux programmeurs d'accéder à des tableaux hors des limites car un tableau n'est en fait qu'un pointeur sur la mémoire consécutive. La convention t1[100]
est juste 100 octets après le pointeur, peu importe ce que c'est.
Si vous voulez des tableaux "sûrs", utilisez la classe vector
et appelez la fonction at()
. Cela lancera l'exception out_of_range
si l'accès est invalide.
Stroustrup donne l'exemple suivant:
template<class T> class Vec : public vector<T> {
public:
Vec() : vector<T>() {}
Vec(int s) : vector<T>(s) {}
T& operator[] (int i) {return at(i);}
const T& operator[] (int i) const {return at(i);}
};
Cette classe est limite de sécurité.Je peux l'utiliser comme ceci:
Vec<char> t3(10); // vector of 10 char elements
try {
char t = t3[100]; // access something we shouldn't
}
catch (out_of_range) {
cerr << "Error!" << endl; // now we can't shoot ourselves in the foot
}
Qu'entendez-vous par "t (x) [100] = 'm' est correct pour eux"? C'est juste une coïncidence que vous pouvez définir cette mémoire sur 'm' sans que votre programme plante. Vous n'avez pas alloué cette mémoire de sorte que vous écrivez la fin du tableau dans la mémoire qui pourrait être n'importe quoi. –
Fondamentalement une copie de: http://stackoverflow.com/questions/3902011/whats-the-difference-between-new-char10-and-new-char10, sauf pour ce dernier commentaire dans votre question. 't [100] = 'm'' est bien formé, mais conduit à un comportement indéfini dans les deux cas. Ne pas. – GManNickG
Vous pouvez utiliser 't1 [100]' car lorsque X est un pointeur, X [I] 'est équivalent à' * (X + I) '. Vous déplacez simplement la valeur du pointeur sur 100 éléments et déréférencer. C++ ne se soucie pas ou n'essaye pas de protéger le programmeur de faire des choses stupides. C'est à vous. – GManNickG