我正在编写一个自定义的“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;
}
答案 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();
我个人觉得它更优雅。