2010-07-29 6 views
0
#include <stdio.h> 
#include <stdlib.h> 

typedef struct node { 
    int value; 
    struct node *next; 
}LLIST; 



LLIST *list_add(LLIST **p, int i) 
{ 
    if (p == NULL) 
     return NULL; 
    LLIST *first = malloc(sizeof(LLIST)); 
    if (first == NULL) 
     return NULL; 
    first->value = *first; 
    *p = first; 
    first->value = i; 
} 


int main (int argc, char** argv) { 
    int i=0; 

LLIST *first = NULL; 
list_add(&first, 0); 


    return (EXIT_SUCCESS); 
} 

me génère des erreurs commeliste Linken dans les problèmes Visual Studio 2010

IntelliSense: une valeur de type "void *" ne peuvent pas être utilisés pour initialiser une entité de type "LLIST *"

à la ligne malloc dans list_add pouvez-vous m'aider ??? Quand je tape le code, aucune erreur n'apparaît. IntelliSense m'aide à construire le code du nœud ... mais quand vous compilez cela, cela ... pouvez-vous m'aider à résoudre le problème?

Répondre

1

Vous devez jeter le résultat de malloc:

LLIST *first = (LLIST*)malloc(sizeof(LLIST)); 

modifier:

Vous devez déclarer "d'abord" avant toute autre chose:

LLIST *list_add(LLIST **p, int i) 
{ 
    LLIST* first; 
    if (p == NULL) 
     return NULL; 
    first = malloc(sizeof(LLIST)); 
    if (first == NULL) 
     return NULL; 
    // first->value = *first; 
    *p = first; 
    first->value = i; 
    return first; 
} 
+1

Ne faites jamais un casting quand vous ne le faites pas besoin d'un - le plâtre n'est pas nécessaire en C. –

+0

Je le fais comme ça et puis arrive: Erreur erreur C2275: 'LLIST': utilisation illégale de ce type comme une expression \t avec plus de 8 erreurs ... – user405469

2

compilez-vous à ce que C code? En C++, il n'y a pas de conversion d'un void * vers d'autres types de pointeurs. Vérifiez que votre fichier a une extension .c.

En outre, vous avez une erreur ici:

first->value = *first; 

On peut imaginer, que ce soit vous ou le compilateur sont getting confus par cela.

+1

Il n'y a pas de conversion de void * vers d'autres types de pointeurs? C'est parce que cela augmente la sécurité de type? Mais cela ressemble à une fonctionnalité que les programmeurs C utiliseraient beaucoup et donc C++ devrait le compiler. Est-ce que j'ai râté quelque chose? –

+0

oui le fichier est * .c – user405469

+0

@the C et C++ sont des langages différents - sauf pour les cas triviaux, un compilateur C++ ne compilera pas la plupart du code C. –

0

Bien sûr, cela provoquera une erreur. Comme Neil a répondu à C++ il n'y a pas de conversion d'un void * à d'autres types de pointeurs.

Si vous voulez le faire en C++ utiliser les éléments suivants:

LLIST *list_add(LLIST **p, int i) 
{ 
    if (p == NULL) 
     return NULL; 
    LLIST *first = (LLIST*)malloc(sizeof(LLIST)); 
    if (first == NULL) 
     return NULL; 
    //first->value = *first; 
    *p = first; 
    first->value = i; 
} 

Et s'il vous plaît reconsidérer l'affectation

first->value = *first; 

dans votre code

+0

merci mais maintenant son me trowing ceci: Erreur 2 erreur C2065: 'premier': identificateur non déclaré dans LLIST * first = (LLIST *) malloc (sizeof (LLIST)); – user405469

+0

Mais le code ci-dessus compilé bien pour moi. Veuillez d'abord vérifier que vous avez utilisé LLIST en premier ou LLIST * en premier. –