2012-10-18 9 views
18

Ich schreibe eine benutzerdefinierte "Vektor" -Struktur. Da ich sehr neu bin, verstehe ich nicht, warum ich hier eine "Warning: "one" may be used uninitialized" bekomme.C: Warnung: X kann in dieser Funktion nicht initialisiert werden

Das ist mein vector.h Datei

#ifndef VECTOR_H 
#define VECTOR_H 

typedef struct Vector{ 
    int a; 
    int b; 
    int c; 
}Vector; 

#endif /* VECTOR_ */ 

die Warnung hier auf Linie one->a = 12

#include<stdio.h> 
#include<stdlib.h> 
#include<math.h> 
#include "vector.h" 

int main(void){ 
    Vector* one; 
    one->a = 12; 
    one->b = 13; 
    one->c = -11; 
} 

Antwort

31

one wurde so Punkte zu einer unvorhersehbaren Position nicht zugeordnet. Sie sollten entweder auf den Stack:

Vector one; 
one.a = 12; 
one.b = 13; 
one.c = -11 

oder dynamisch Speicher reservieren für sie:

Vector* one = malloc(sizeof(*one)) 
one->a = 12; 
one->b = 13; 
one->c = -11 
free(one); 

Beachten Sie die Verwendung von free in diesem Fall. Im Allgemeinen benötigen Sie für jeden Anruf, der an malloc getätigt wird, genau einen Anruf an free.

12

Sie erhalten die Warnung kommt, weil Sie keinen Wert auf one, der ein Zeiger zugewiesen haben . Dies ist ein nicht definiertes Verhalten.

Sie sollten es so erklären:

Vector* one = malloc(sizeof(Vector)); 

oder so:

one.a = 12; 
one.b = 13; 
one.c = -11; 

:

Vector one; 

, in dem Fall, dass Sie -> Operator mit . wie diese ersetzen müssen Schließlich können Sie in C99 und später mit der Bezeichnung i nitializers:

Vector one = { 
    .a = 12 
, .b = 13 
, .c = -11 
}; 
4

Wenn Sie Vector *one verwenden, erstellen Sie lediglich einen Zeiger auf die Struktur, aber es ist kein Speicher zugewiesen.

Verwenden Sie einfach one = (Vector *)malloc(sizeof(Vector));, um Speicher zu deklarieren und instanziieren.

Verwandte Themen