2016-11-27 4 views
-2

Je faisais un test et le moteur de test en ligne affichait une erreur de segmentation, ce qui est déroutant car sans plus de détails, et j'ai vérifié le pointeur non NULL et ils fonctionnent très bien, mais ne pas comment tableau fonctionne ici. Parce que lors du débogage, tout va bien, jusqu'à ce que j'essaie de cout/imprimer le tableau. il rapporte un est écrasé ici et casse. Je ne peux rien faire ici si ça casse, et je me casse la pause ou continue. si je continue, ça va très bien. donc j'étais vraiment confus.Erreur de segmentation dans un programme qui inverse un tableau alloué dynamiquement

Mon ordinateur est Windows 7, je cours le code dans Visual Studio 2010 C++. Le débogage n'est pas si clair pour résoudre le problème, et j'apprends le C++ pas très efficace. Résoudre avec Array besoin d'allocation dynamique. Cela a quelque chose à avec l'allocation dynamique, quand je travaille dans Java, je crée un nouveau tableau. Je dois

int[] newArray = {2,4,1,2,3}; 

ou

int[] newArray = new int[] {2,4,1,2,3}; 

Enfin, ce problème est résolu, ce qui me rend très heureux. La lecture et l'apprentissage sont très importants, le codage est également important. Merci à tous,

Et en utilisant vecteur au lieu d'utiliser tableau. Ce serait plus facile.

#include <cstdio> 
#include <vector> 
#include <iostream> 
using namespace std; 
int main() { 
    int a; 
    int len; 
    vector<int> myvector; 
    cin >> len; 
    for(int i = 0; i < len; i++){ 
     cin >> a; 
     myvector.push_back(a); 
    } 
    reverse(myvector.begin(), myvector.end()); 
    for(int i = 0; i < len; i++){ 
     cout << myvector[i] << " "; 
    } 
    return 0; 
} 

aide tableau à nouveau (je doute le code suivant):

#include<iostream> 
//#include<cstdlib> 
using namespace std; 

void reverseArray(int size, int nums[]){ 
    if(size > 1){ 
     int *p = &nums[size-1]; 
     int *q = nums; 
     for(int i = 0; i< size/2; i++){ 
      swap(*p, *q); 
      p--; 
      q++; 
     } 
    } 
} 

int main(){ 
    int len; 
    cin >> len; 
    int *a = new int[len];//a point to the first ele. 

    for(int i = 0; i< len; i++){ 
     cin >> a[i]; 
    } 
    reverseArray(len, a); 
    for(int i = 0; i < len; i++){ 
     cout << a[i] << " "; 
    } 
    delete [] a; 
    return 0; 

} 

Il a fonctionné parfaitement sur mon ordinateur portable, ce qui est source de confusion parce qu'un est pointeur, mais je l'utilise comme un tableau. Il ne devrait pas fonctionner ......

Version finale de tableau: http://ideone.com/ZMsD35 Fait parfaitement.

#include<iostream> 
using namespace std; 

int main(){ 
    int len; 
    cin >> len; 
    int *a = new int[len]; 
    for(int i = 0; i< len; i++){ 
     cin >> a[i]; 
    } 
    reverse(a, a+len); 
    for(int i = 0; i< len; i++){ 
     cout << a[i]; 
    } 
    delete [] a; 
    system("pause"); 
    return 0; 

} 
+1

commentaires ne sont pas pour la discussion élargie; cette conversation a été [déplacée pour discuter] (http://chat.stackoverflow.com/rooms/129268/discussion-on-question-by-r-mia-segmentation-fault-in-a-program-that-reverses- une). –

Répondre

0

La raison la plus probable d'un segfault est l'entrée. Lorsque le logiciel de test passe len de taille suffisante pour déborder la zone de stockage automatique, votre programme se bloque sur cette ligne:

int a[len]; 

La valeur exacte de len dépend du système, mais une entrée de 1.000.000 devrait le faire le plus systèmes communs.

Le correctif est vraiment simple - remplacer la déclaration avec

int a* = new int[len]; 

Cela placera les données dans la mémoire dynamique, plutôt que la mémoire automatique. Cela rendra également votre programme conforme aux normes, car les tableaux de longueur variable en C++ sont une extension des standards.

Ne pas oublier de supprimer a une fois que vous avez terminé pour éviter la fuite de mémoire:

delete[] a; 
+0

Salut, Merci beaucoup! Cela fonctionne maintenant, puis-je connaître la différence entre les deux lignes clés? Ai-je besoin de supprimer tous les pointeurs? – flowera

+0

@ R.mia Cela modifie le placement de vos données de la mémoire automatique (pile) à la mémoire dynamique (tas). – dasblinkenlight

+0

Puis-je savoir quel est le document ou le lien auquel je peux me référer/ – flowera