2012-11-22 3 views
0

Qu'est-ce qui me manque? Si je veux incrémenter un compteur dans une fonction séparée, pourquoi me donne-t-il un défaut de segmentation?Défaut de segmentation, Incrémentation des valeurs dans les pointeurs

int point(int *cow); 

int main() 
{ 
    int *cow = 0; 
    point(cow); 
    return(0); 

} 

int point(int *cow) { 
    (*cow)++; 
    return(0); 
} 
+0

N'avez pas fait C dans un moment, mais ne définissez-vous pas le pointeur sur une position 0 en mémoire, ne définissant pas la valeur de la mémoire comme 0? –

Répondre

4

déréférencement d'un pointeur NULL est un comportement non défini en C.

Peut-être que vous vouliez faire à la place:

int a = 0; 
int *cow = &a; 

point(cow); 

Notez que le pointeur temporaire cow n'est pas nécessaire et vous pouvez passer directement &a à point fonction.

+1

'point (& a)' aurait probablement suffi ... –

2

La bonne façon de le faire serait la suivante:

void point (int *cow); 

int main() { 
    int cow = 0; // Create a simple int, not a pointer 
    point (&cow); // Pass address (&) of your int 
    return 0; 
} 

void point (int *cow) { 
    (*cow)++; 
} 

Vous n'avez pas besoin d'avoir un pointeur dans votre principal, il suffit de passer le pointeur à votre fonction d'incrément.

1

Vous tentez de déréférencer un pointeur NULL, ce qui provoquera certainement le blocage de votre programme. Vous avez probablement voulu dire de faire ceci:

int point(int *cow); 

int main() 
{ 
    int cow = 0; 
    point(&cow); 
    return(0); 

} 

int point(int *cow) { 
    (*cow)++; 
    return(0); 
} 

Dans votre code d'origine, vous avez créé un pointeur à int (ex: int * vache), mais vous ne avez jamais créé un int pour stocker la valeur que vous essayez de incrément. Ce qui suit est aussi un exemple valide qui combine mon changement de code ci-dessus avec votre code d'origine:

int point(int *cow); 

int main() 
{ 
    int cow = 0; 
    int* pCow = &cow; 
    point(pCow); 
    return(0); 

} 

int point(int *cow) { 
    (*cow)++; 
    return(0); 
} 

Bonne chance!

1
int *cow = 0; 

est déclarant « vache » pour être un pointeur vers un entier, puis attribuer ce pointeur à la valeur zéro. Vous le passez ensuite à point() qui essaie de déréférencer "0" puis incrémente la valeur stockée à cet emplacement mémoire.

Essayez ceci:

int x = 0; 
int *cow = &x; 
point(cow); 
0

(Définition wiki) Une erreur de segmentation (souvent abrégé en segfault), violation d'erreur de bus ou l'accès est généralement une tentative d'accéder à la mémoire que le CPU ne peut pas répondre physiquement.

int *cow = 0;

Lorsque le programme tente d'accéder à la mémoire a souligné ci-dessus, vous obtenez une erreur de segmentation, car il n'est pas adresse valide.

Questions connexes