2016-12-20 2 views
-4

Dies ist nur ein Teil eines größeren Codes, aber es ist voller Fehler, so dass ich versuche, sie nacheinander zu beheben. Wenn ich versuche, malloc zu verwenden, um auf meine Zeiger Vektor kehrt die Linie diesen FehlerKann Malloc mit dem Datentyp struct nicht verwendet werden?

main.c|14|error: expected '{' before '*' token

Alle Auflösungen?

struct students { 
     int group; 
     char name[20]; 
     int grade; 
    }; 

    int main() 
    { 
     struct students *ptr[100]; 
     int num, i, max=0; 
     scanf("%d", &num); 
     ptr = (struct*) malloc(num * sizeof(struct)); 
     if(ptr == NULL) 
      { 
       printf("error"); 
       exit(0); 
      } 
    } 
+1

Sie in C malloc Ergebnis Gießen setzen 'struct' wo Sie' struct Studentische gesetzt haben sollte. – user2357112

+1

'struct *' ist ein Syntaxfehler. Vielleicht meintest du 'struct students *'. Übrigens können Sie diesen Fehler vermeiden, indem Sie malloc, das ohnehin redundant ist, nicht einwerfen und den Typ nicht in der 'sizeof' wiederholen. –

+0

'sizeof (struct Studenten)'. Werfen Sie nicht die Rückgabe von malloc. –

Antwort

-1

Struct Schlüsselwort für die Deklaration/Definition von Strukturen in C reserviert ist, ist es nicht variabel, noch etwas, das Sie kippt Größe davon. Sie haben struct Studenten deklariert (nach Ihrem Code, ich denke, es sollte Student statt Studenten sein), jetzt müssen Sie eine Variable definieren und Speicherplatz für 100 Strukturen über einen Doppelzeiger zuweisen, sollte der Code etwa so sein

struct student { 
     int group; 
     char name[20]; 
     int grade; 
    }; 

    int main() 
    { 
     struct student ** ptr; 
     int num, i, max=0; 
     scanf("%d", &num); 
     ptr = malloc(num * sizeof(struct student)); 
     if(ptr == NULL) 
      { 
       printf("error"); 
       exit(0); 
      } 
    } 

Jetzt können Sie einzelne Schüler mit Array-Index zugreifen

ptr[0]->grade = 20; // putting 20 in grade of first student 

auch gibt es keine Notwendigkeit für

0
  1. Während malloc für ein Array 1D verwenden, sollten Sie einen Zeiger, nicht ein Array von Zeigern zuteilen, wie Sie getan haben.

  2. Während der Zuweisung verwenden Sie sizeof(struct). Der Typ hier ist struct students und Sie brauchen sizeof(struct students)

  3. Werfen Sie nicht das Ergebnis von malloc. Siehe Do I cast the result of malloc?

Der endgültige Code

struct students *ptr; 
ptr = malloc (num * sizeof(struct students)); 
0

Sie haben, ist ein Array von Zeigern zu strukturieren. Sie sollten Speicher für sie separat reservieren.

for(int i=0; i<100 && i<num; i++) 
{ 
    ptr[i] = malloc(sizeof(struct students)); 
    if(0 == ptr[i]) 
    { 
     /* Handle this case. */ 
    } 
} 
/* Your code. */ 

/* At the end free the memory. */ 
for(int i=0; i<100; i++) 
{ 
    if(0 != ptr[i]) 
    { 
     free(ptr[i]); 
     ptr[i] = 0; 
    } 
} 

Aber ich denke, Sie nur ein Array von struct Studenten zuweisen wollte. In diesem Fall brauchen Sie nur einen Zeiger.

struct students *ptr = 0; 

/* You allocate memory and store it in that pointer. */ 
ptr = malloc(num * sizeof(struct students)); 
if(0 == ptr) 
{ 
    /* Handle this case. */ 
} 

Sie können i-te Element des Arrays zugreifen wie ptr[i]. Aber fügen Sie die notwendigen Überprüfungen hinzu und stellen Sie sicher, dass i < num.

Sie müssen den zugewiesenen Speicher freigeben, wenn Sie mit dem Array fertig sind.

if(0 != ptr) 
{ 
    free(ptr); 
    ptr = 0; 
} 
Verwandte Themen