2012-10-18 10 views
18

Özel bir "vektör" yapısı yazıyorum. Çok yeni olduğum için, neden burada bir "Warning: "one" may be used uninitialized" alıyorum anlamıyorum.C: uyarı: X, bu işlevde başlatılmamış olarak kullanılabilir

Bu uyarı hattı üzerinde buraya gelir

#ifndef VECTOR_H 
#define VECTOR_H 

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

#endif /* VECTOR_ */ 

benim vector.h dosyasıdır 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; 
} 

cevap

31

one tahmin edilemez bir konuma noktaları böylece tahsis edilmemiştir. Bunun için bellek ayrılamadı dinamik

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

ya: Ya yığını üzerine koyun gerektiğini

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

Not bu durumda free kullanımı. Genel olarak, malloc için yapılan her çağrı için tam olarak free numaralı aramaya ihtiyacınız olacaktır.

12

Eğer bir gösterici one bir değer, atamadı çünkü uyarı olsun . Bu tanımlanmamış bir davranış.

Böyle beyan etmelidir:

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

veya böyle:

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

: Böyle . ile -> operatörü değiştirmeniz gerekiyor

Vector one; 

bu durumda Son olarak, C99 ve sonrasında belirtilen i nitializers:

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

Vector *one'u kullandığınızda, yalnızca yapıya bir işaretçi yaratıyorsunuz ancak buna ayrılmış bir bellek yok.

Belleği bildirmek ve başlatmak için one = (Vector *)malloc(sizeof(Vector));'u kullanmanız yeterlidir.

İlgili konular