web-dev-qa-db-ja.com

警告:Xはこの関数で初期化せずに使用できます

カスタムの「ベクター」構造体を書いています。ここでWarning: "one" may be used uninitializedを取得している理由がわかりません。

これは私のvector.hファイルです

#ifndef VECTOR_H
#define VECTOR_H

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

#endif /* VECTOR_ */

警告はここ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;
}
25
Valentino Ru

oneは割り当てられていないため、予測できない場所を指します。スタックに配置する必要があります。

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

または動的にメモリを割り当てます:

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

この場合、freeの使用に注意してください。一般に、freeを呼び出すたびにmallocを1回呼び出す必要があります。

38
simonc

ポインターであるoneに値を割り当てなかったため、警告が表示されます。これは未定義の動作です。

次のように宣言する必要があります。

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

またはこのように:

Vector one;

この場合、次のように->演算子を.に置き換える必要があります。

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

最後に、C99以降では、指定された初期化子を使用できます。

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

_Vector *one_を使用する場合、単に構造体へのポインタを作成しているだけですが、メモリは割り当てられていません。

単にone = (Vector *)malloc(sizeof(Vector));を使用してメモリを宣言し、インスタンス化します。

6
plaknas