2010-06-08 3 views
0

Je suis novice en programmation c. Quelqu'un pourrait-il me dire quel est le problème avec le programme suivant?c Pointeur vers un pointeur ou transmission d'une liste aux fonctions


typedef struct Person_s 
{ 
    int age; 
    char name[40]; 
} Person_t; 


int process_list(int *countReturned, Person_t **p_list) 
{ 

    Person_t *rowPtr=0; 
    //the actual program will fethc data from DB 

    int count =1; 

if(!((*p_list) = (Person_t *) malloc(sizeof(Person_t)))) 
{ 
    return -1; 
} 

rowPtr = *p_list; 

rowPtr[count-1].age =19; 
strcpy(rowPtr[count-1].name,"Prince Dastan"); 
*countReturned = count; 

    return 0; 
} 


int main(int argc, char *argv[]) 
{ 
     Person_t *tmpPerson=0; 
     Person_t **p_list=0; 
     int *count=0; 
     int i; 

     process_list(count,p_list); 

     tmpPerson = *p_list; 

     for(i=0; i< *count; i++) 
     { 
      printf("Name: %s , age: %d\n",tmpPerson->name,tmpPerson->age); 
      tmpPerson++; 
     } 

     //free(tmpPerson); 

    return 0; 
} 
+0

Êtes-vous à la recherche d'un avis de code ou y a-t-il une erreur spécifique? Si oui, quel est le problème? –

Répondre

1

Vous devriez avoir principale:

Person_t *p_list=0; 
... 
process_list(count, &p_list); 

Le code comme passe par écrit dans 0 à process_list, puis vous avez:

*0 = (Person_t *)malloc(...); 

Cela provoque 0 être déréférencé, et votre code va planter.

+0

Passer 'count' avec' count' déclaré comme 'int * count = 0' va continuer à déréférencer NULL et tomber en panne. – Chuck

0

La valeur de p_list lorsque vous entrez dans la fonction est 0. Si vous déréférencez 0, vous obtenez une erreur de bus.

if(!((*p_list) = (Person_t *) malloc(sizeof(Person_t)))) 

(90% des problèmes C sont causés par le déréférencement d'un pointeur NULL, tout comme 90% des problèmes Java sont causés par une mauvaise configuration classpath. :-)

3

Votre problème est que vous » re définissant les pointeurs pour pointer sur NULL (0), puis les déréférencer. Vous n'êtes pas autorisé à déréférencer NULL. Voulez vous voulez plus comme ceci:

int main(int argc, char *argv[]) 
{ 
     Person_t tmpPerson; 
     Person_t *p_list=0; 
     int count; 
     int i; 

     process_list(&count, &p_list); 

     tmpPerson = *p_list; 
     // and so on... 

Le & est la « adresse de » opérateur, qui renvoie un pointeur sur l'adresse de la variable. Donc, cela passe un pointeur vers count et p_list, que votre fonction utilise ensuite pour définir ces variables, ce qui semble être ce que vous voulez faire.

+0

J'ai besoin de récupérer une liste avec count de la fonction process_list(). "Person_t * p_list = 0;" Est-ce que cela retournera une liste? – Nazrul

+0

@ user361808: Il renvoie un pointeur vers un tableau de 'Pointer_t' (où le tableau peut en fait être un seul Pointer_t, comme dans votre code de test). – Chuck

Questions connexes