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

注意free在这种情况下的使用。一般来说,free每次调用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 回答