Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构成员可能未初始化_C_Gcc_Struct - Fatal编程技术网

C 结构成员可能未初始化

C 结构成员可能未初始化,c,gcc,struct,C,Gcc,Struct,我目前正在为ESP8266编写WebSocket守护程序。我目前正在努力解决一个无法解释的错误。我定义了一个结构来保存WebSocket框架的所有信息 typedef struct { uint8_t flags; uint8_t opcode; uint8_t isMasked; uint64_t payloadLength; uint32_t maskingKey; char* payloadData; } WSFrame; 然后,我按照中所

我目前正在为ESP8266编写WebSocket守护程序。我目前正在努力解决一个无法解释的错误。我定义了一个结构来保存WebSocket框架的所有信息

typedef struct {
    uint8_t flags;
    uint8_t opcode;
    uint8_t isMasked;
    uint64_t payloadLength;
    uint32_t maskingKey;
    char* payloadData;
} WSFrame;
然后,我按照中所述解析消息。因为我是服务器,所以我需要取消数据的掩码。同样,这个方法在这里非常有用。但是,xtensalx106的编译器给出了以下错误:

user/websocketd.c: In function 'wsRecvCb':
user/websocketd.c:104:11: error: 'frame.maskingKey' may be used uninitialized in this function [-Werror=maybe-uninitialized]
   WSFrame frame;
           ^
cc1: all warnings being treated as errors
对于以下代码:

WSFrame frame;
parseWsFrame(data, &frame);

os_printf("payloadLength=%"PRIu64"\n", frame.payloadLength);
unmaskWsPayload(frame.payloadData, frame.payloadLength, frame.maskingKey);
即使在
parseWSFrame
中定义了
frame.maskingKey

我监督什么?为什么它抱怨
“frame.maskingKey”
,但却提到了初始化中的错误

如果我做
frame.maskingKey=0在定义
WSFrame之后,编译器将关闭。但是,我不能声明uint32\u t maskingKey=0;在我的结构定义中


我不想使用任何堆分配,所以我不想malloc任何东西。

我认为这里的主要问题是编译时的
-Werror
标志,它将警告视为错误。如果您仍然希望保留该编译器标志,那么最好将
frame.maskingKey
初始化为
0
,就像您所做的那样


不允许在结构声明中初始化结构成员。因此,在结构声明中不可能执行
uint32\u t maskingKey=0

什么是
parseWsFrame()
函数?为什么不这样初始化结构:
WSFrame frame=frame\u INIT
其中
FRAME_INIT
#define FRAME_INIT{0,0,0,0,0,0}
我使用
{0,0,0,0,0,0}
而不是
{0}
,因为如果使用最后一个编译器,某些编译器仍然不会关闭。
maskingKey
是在WSFrame中有条件地初始化的,由于并不总是需要它,因此可能存在通过
parseWsFrame()
的代码路径,其中
frame.maskingKey
可能无法设置?换句话说,可能它通常是初始化的,但在某些情况下它可能不是,并且编译器足够聪明来识别它?@chuck258但是,考虑到您发布的代码,
frame.maskingKey
总是需要的,即使
unmaskWsPayload()
有条件地选择不使用它,因为它是通过值传递给
unmaskWsPayload()
,并且编译器注意到它正在传递一个可能的随机/垃圾值作为参数…这对c正常吗?我确实想要-Werror标志,但这似乎是不必要的代码复制如果你想要-Werror标志,你必须初始化
帧。maskingKey
或整个
帧,正如@Jack所说的那样