2012-10-18 14 views
18

Piszę niestandardową strukturę "wektorową". Ponieważ jestem bardzo nowy, nie rozumiem, dlaczego dostaję tutaj "Warning: "one" may be used uninitialized".C: ostrzeżenie: X może być użyty niezainicjowany w tej funkcji

To jest mój plik vector.h

#ifndef VECTOR_H 
#define VECTOR_H 

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

#endif /* VECTOR_ */ 

ostrzeżenie przychodzi tutaj na linii 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; 
} 

Odpowiedz

31

one nie została przypisana do punktów tak nieprzewidywalnym miejscu. Należy albo umieścić go na stosie:

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

lub dynamicznie przydzielać pamięć do niego:

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

Uwaga wykorzystanie free w tym przypadku. Zwykle dla każdego połączenia z numerem malloc potrzebne jest dokładnie jedno połączenie z numerem free.

12

dostać ostrzeżenie, ponieważ nie przypisać wartość one, która jest wskaźnikiem . To jest niezdefiniowane zachowanie.

powinien zadeklarować go tak:

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

lub tak:

Vector one; 

w takim przypadku trzeba wymienić -> operatorowi . tak:

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

Wreszcie, w C99 i później można użyć oznaczonych i nitializers:

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

Podczas korzystania z Vector *one tworzysz tylko wskaźnik do struktury, ale nie ma do niej przydzielonej pamięci.

Po prostu użyj one = (Vector *)malloc(sizeof(Vector));, aby zadeklarować pamięć i utworzyć instancję.

Powiązane problemy