カスタムの「ベクター」構造体を書いています。ここで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;
}
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回呼び出す必要があります。
ポインターである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
};
_Vector *one
_を使用する場合、単に構造体へのポインタを作成しているだけですが、メモリは割り当てられていません。
単にone = (Vector *)malloc(sizeof(Vector));
を使用してメモリを宣言し、インスタンス化します。