2014-05-12 4 views
0

mon programme C se compile et s'exécute correctement dans PuTTY jusqu'à ce que la boucle soit répétée pour la deuxième fois. Un ami avec le même code semblait pouvoir faire fonctionner son programme, et j'ai même essayé de changer les différences entre mon code et le sien à son code, et toujours pas de cigare. Ci-dessous est le code et un exemple de ce qui se passe lorsque le code est exécuté. Je crois que la question se situe dans la déclaration de malloc.Erreur de segmentation après la deuxième itération d'une boucle

#include<stdlib.h> 
#include<stdio.h> 


void getInts(int ** integersArray, int * numInput); 

int main() { 

    int * integersArray; 
    int numInput; 
    int i; 

    getInts(&integersArray, &numInput); 

    for (i = 0; i < numInput; i++) { 
    printf("number %d = %d\n", i+1, integersArray[i]); 
    } 

    return 0; 
} 


void getInts(int ** integersArray, int * numInput) { 
    int i; 

    printf("Please enter the number of intergers you want to input\n"); 
    scanf("%d", numInput); 

    *integersArray = (int *) malloc(sizeof(int) * *numInput); 

    for (i = 0; i < *numInput; i++) { 
    printf("please enter integer %d: ", i+1); 
    scanf("%d", (integersArray[i])); 
    } 
} 

Sortie

Please enter the number of intergers you want to input 
4 
please enter integer 1: 2 
please enter integer 2: 3 
Segmentation fault (core dumped) 
+0

ce que vous essayez de faire avec '* * numInput'? Double multiplication? NumInput est un int, pas un pointeur, donc vous ne pouvez pas utiliser son contenu. – Mawg

+0

@Mawg Incorrect. Le paramètre est 'int * numInput'. –

+0

Désolé, j'ai trouvé la déclaration précédente. Mon mauvais, votre +1. Dans ce cas, je recommande de prêter attention aux avertissements du compilateur, en exécutant 'cppcheck', depuis: http://cppcheck.wiki.sourceforge.net/ puis en passant par le débogueur – Mawg

Répondre

2

Le problème est ici:

scanf("%d", (integersArray[i])); 

Rappelez-vous, integersArray est un pointeur - le tableau. En d'autres termes, il s'agit d'un pointeur vers un pointeur vers le premier élément du tableau.

Essayez plutôt:

scanf("%d", &(*integersArray)[i]); 

D'abord, depuis integersArray est un pointeur vers le tableau int, je déréférencer: (*integersArray). Ensuite, j'indexe au i ème élément du tableau: (*integersArray)[i].

Mais, l'adresse scanf attend de l'entier qui obtient le résultat, je prends l'adresse de cet élément: &(*integersArray)[i].

La chose importante à retenir est que vous devez déréférencer d'abord integersArray.

Confirmé avec gcc 4.8.2 i686-pc-cygwin.


Voici ce qui devrait se produire, et arrive en effet (par chance!) À la première itération.

           ______ 
integersArray ---> <malloc_result> ---> |______| 
              |______| 
              |______| 
              |______| 

Cependant, la deuxième itération, le mauvais pointeur est indexé, comme ceci:

           ______            
integersArray -| <malloc_result> ---> |______| 
       |       |______| 
       |       |______| 
       |       |______| 
       |  
       |-> <malloc_result+4> ---> ????????? 
Questions connexes