我正在运行gcc 4.8.4并使用选项进行编译:
CXXFLAGS+= -Wall -std=c++11 -pedantic -lpthread
我想使用memset将结构归零:
typedef struct
{
TSfMsgHeader errorHeader;
TErrorHeader errorType;
TErrorDetails errorDetails;
}TErrorInd;
uint8 g_errorIndBlock[16];
TErrorInd* p_msg = (TErrorInd *)&g_errorIndBlock[0];
memset((int*)p_msg, 0, sizeof(TErrorInd));
这将导致警告:
在函数'void * memset(void *,int,size_t)'中,从../MessageHandling.cpp:174:46处的'void sendMsgPduError(TMsgPduError *,uint32)'内联:
/usr/include/x86_64-linux-gnu/bits/string3.h:84:70:警告:调用void * __builtin ___ memset_chk(void *,int,long unsigned int,long unsigned int)将始终溢出目标缓冲区[启用默认]
返回__builtin___memset_chk(__dest,__ ch,__ len,__ bos0(__dest));
我意识到这是一个明智的警告,但我不知道如何修改代码以解决问题。
我读到std :: fill_n比memset更可取。那是对的吗?
如果是这样,我怎么用fill_n代替memset?
检查sizeof(TErrorInd)的值,由于某种原因,gcc认为它大于sizeof(uint8)*16。也许您没有计算对齐字节,而是计算结构大小。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句