2017-08-01 2 views
1

Voici le code c:Erreur lors du débogage d'un programme C sur les pointeurs

#include<stdio.h> 

int main() 
{ 
    int a[]={0,1,2,3,4}; 
    int*p[]={a,a+1,a+2,a+3,a+4}; 
    int**ptr=p; 
    ptr++; 

    printf("%d , %d ",*ptr-a , **ptr); 
    *ptr++; 
    printf("\n%d , %d ",*ptr-a , **ptr); 
    *++ptr; 
    printf("\n%d , %d ",*ptr-a , **ptr); 
    ++*ptr; 
    printf("\n%d , %d ", *ptr-a , **ptr); 

    return 0; 
} 

the gdb error highlighted in black??

Je suis incapable de comprendre l'erreur et ce qui devrait être modifié dans le code.

+2

Vous n » Ne laissez pas le débogueur exécuter la ligne 8. Je suppose que c'est la raison pour laquelle vous obtenez cette erreur. – Gaurav

+0

Oui cela fonctionne. Je vous remercie. Je ne savais pas comment fonctionnent les points de rupture. –

+0

Vous devez lancer 'ptr - a'' int', car le type résultant est 'ptrdiff_t': http://ideone.com/CfjqzO Aussi le' * ' dans '* ptr ++; 'est inutile. – mch

Répondre

2

Vous n'avez pas encore exécuté la ligne 8 dans gdb.

8 int **ptr = p; 

Donc, jusqu'à présent ptr ne définit pas encore dans votre programme. Par conséquent, ne peut pas y accéder. Vous pouvez appuyer sur commande n dans l'invite de gdb puis suivre par print

(gdb) n 
(gdb) print *ptr 

En outre, votre programme devrait avoir %ld au lieu de %d dans printf comme spécificateur de format au silence avertissement du compilateur comme dans

printf("%ld , %ld ",*ptr-a , **ptr); 
1

Remplacez% d par% ld, cela devrait fonctionner correctement.

Vous pouvez vous référer à format specifiers details pour plus de précisions à ce sujet.

+3

'ptr-a' aboutit à un type de' ptrdiff_t'. '"% ld "' est pour 'long'. Depuis C99, devrait utiliser '"% td "'. – chux

+1

Il est également recommandé d'ajouter '-Wformat' à la commande de compilation (ou, mieux,' -Wall -Wextra'). –