41

私はカスタムの「ベクトル」構造体を書いています。なぜここに来たのかわかりません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;
}
4

4 に答える 4

57

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);

この場合のの使用に注意してくださいfreefree一般に、に対して行われる呼び出しごとに、に対して1つの呼び出しが必要ですmalloc

于 2012-10-18T16:07:51.967 に答える
19

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
};
于 2012-10-18T16:07:38.073 に答える
8

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

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

于 2012-10-18T18:33:49.587 に答える
1

これは最も専門的な解決策ではないかもしれませんが、を使用して初期化する代わりに、次を使用してmalloc初期化することもできますnew

Vector *one = new Vector();

個人的にはもっとエレガントだと思います。

于 2021-07-16T17:09:58.837 に答える