2013-04-13 4 views
0

J'ai fait une fonction simple en C qui prend comme arguments 1 pointeur sur int, 1 pointeur double sur int et un entier (le troisième argument est peut-être inutile car il représente le nombre d'entiers sont stockés dans l'espace indiqué par le premier argument). Ce qu'il fait est: D'abord, fait assez d'espace dans la mémoire pour contenir 2 entiers et définit le deuxième argument pour pointer vers cet espace. Ensuite, copie les entiers de l'espace vers lequel le premier argument pointe vers l'espace vers lequel pointe le second argument. Troisièmement, il incrémente tous les entiers dans l'espace que le premier argument pointe par 1. Je sais que cette fonction est inutile, mais je veux savoir ce qui ne va pas avec ma solution. Voici le code:A propos d'une fonction qui utilise des pointeurs en C

#include <stdlib.h> 
#include <stdio.h> 
int *x, *y; 

void duplicateAndIncreaseByOne(int *arg1, int **arg2, int arg1Elements){ 
    int ctr; 
    *arg2 = (int *) malloc(arg1Elements * sizeof(int)); 
    for(ctr = 0; ctr < arg1Elements; ctr++){   
     **(arg2 + ctr) = *(arg1 + ctr); 
     *(arg1 + ctr) = *(arg1 + ctr) + 1; 
    } 
} 

int main() { 
    int j; 
    y=(int *)malloc(2*sizeof(int)); 
    *y=10; *(y+1)=50; 
    duplicateAndIncreaseByOne(y, &x, 2); 
    printf("The pointer y contains the elements y[0] = %d and y[1] = %d\n", y[0], y[1]); 
    printf("The pointer x contains the elements x[0] = %d and x[1] = %d\n", x[0], x[1]); 
} 
+0

Y at-il un problème quelque part ici? S'il vous plaît préciser ce que vous avez besoin d'aide avec ... –

Répondre

2

Dans la ligne

**(arg2 + ctr) = *(arg1 + ctr); 

vous ajoutez le décalage arg2 au lieu de *arg2. Cela devrait être

*(*arg2 + ctr) = *(arg1 + ctr); 

En ce moment, vous déréférencement un inexistant int** passé arg2.

+1

Ouais, c'est tout. –

+0

merci! ça marche maintenant! Mais je ne peux pas comprendre pourquoi je n'ai pas eu une erreur à la compilation. – mgus

+1

@KostasKonstantinidis Le compilateur peut seulement vérifier que les types sont corrects, pas la sémantique - il ne sait pas ce que vous voulez faire. Les types étaient corrects, donc le compilateur n'avait aucune raison de se plaindre. –