警告:X可能在此功能中未初始化使用

时间:2012-10-18 16:05:43

标签: c warnings

我正在编写一个自定义的“vector”结构。我不明白为什么我在这里得到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 个答案:

答案 0 :(得分:37)

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 :(得分:16)

您收到警告,因为您没有为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
};

答案 2 :(得分:6)

当你使用Vector *one时,你只是在创建一个指向结构的指针,但是没有分配给它的内存。

只需使用one = (Vector *)malloc(sizeof(Vector));声明内存并实例化它。

答案 3 :(得分:0)

这可能不是最专业的解决方案,但除了使用 malloc 进行初始化之外,您还可以使用 new 进行初始化:

Vector *one = new Vector();

我个人觉得它更优雅。