【发布时间】:2016-12-25 05:40:06
【问题描述】:
我正在运行 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) 将始终溢出目标缓冲区[默认启用]
return __builtin___memset_chk(__dest, __ch, __len, __bos0 (__dest));
我意识到这是一个明智的警告,但我不知道如何修改代码来修复它。
我读到 std::fill_n 比 memset 更受欢迎。对吗?
如果是这样,我将如何将 memset 替换为 fill_n?
【问题讨论】:
-
另外,为什么要投到
int*? -
g_errorIndBlock[16];为什么是 16?你怎么知道的?