相关疑难解决方法(0)

memset()或值初始化将结构清零?

在Win32 API编程中,通常使用struct具有多个字段的C s.通常只有其中几个具有有意义的值,而其他所有值都必须归零.这可以通过以下两种方式之一实现:

STRUCT theStruct;
memset( &theStruct, 0, sizeof( STRUCT ) );
Run Code Online (Sandbox Code Playgroud)

要么

STRUCT theStruct = {};
Run Code Online (Sandbox Code Playgroud)

第二个变体看起来更干净 - 它是一个单行,它没有任何可能输错的参数并导致错误被种植.

与第一个变体相比,它有任何缺点吗?使用哪种变体?为什么?

c c++ struct initialization visual-c++

63
推荐指数
6
解决办法
7万
查看次数

memset(&mystruct,0,sizeof mystruct)与mystruct = {0}相同;?

我正在读取默认情况下数组/结构的初始值,并有这个问题:

memset(&mystruct, 0, sizeof mystruct)一样的mystruct = { 0 };

如果不是,有什么区别?

c struct

19
推荐指数
4
解决办法
2万
查看次数

是否可以保证memset会将结构中的填充位清零?

一般来说,根据C标准,保证带有0的memset()会将C结构中的填充位清零吗?

那gcc怎么样?

例如,类似于:

struct MyStruct
{
    unsigned char   member1;
    unsigned int    member2;
    char        member3;
    unsigned char   member4;
    float       member5;    
};

struct MyStruct ms;

memset(&ms, 0, sizeof( struct MyStruct));
Run Code Online (Sandbox Code Playgroud)

c gcc memset

10
推荐指数
3
解决办法
1309
查看次数

10
推荐指数
2
解决办法
1万
查看次数

在包含浮点数的struct上使用memset()

在C/C++混合项目中,我发现了一些我可以减少的代码

#include <mem.h>

struct StructContainingDouble
{
    double d;
    /// other elements omitted
};

void clear(StructContainingDouble* p)
{
    memset(p, 0, sizeof *p);
}
Run Code Online (Sandbox Code Playgroud)

不停止Cppcheck提高可移植性警告

在包含浮点数的struct上使用memset().

消息是正确的,但由于浮点数被声明为double,因此它似乎是误报,因为在(正)零值的两倍中,按照IEEE 754标准进行编码:[*]

0 00000000000 0000000000000000000000000000000000000000000000000000
Run Code Online (Sandbox Code Playgroud)

因此,我倾向于简单地压制警告而忘记它

void clear(ContainingDouble* p)
{
    // cppcheck-suppress memsetClassFloat
    memset(p, 0, sizeof *p);
}
Run Code Online (Sandbox Code Playgroud)

但也许这里真的存在可移植性问题?

附录:

实际代码基于Win32平台.该结构用于管理对共享内存的访问,这就是构造函数无用的原因.而且不仅是该结构的一个对象必须归零,而是嵌入另一个结构的数组,如下所示:

#include <mem.h>

struct Slot
{
    double d;
    // more members...
};

struct SharedMem
{
    Slot slots[2048];
    // more members...
};

void clear(SharedMem* p)
{
    memset(p, 0, sizeof *p);
}
Run Code Online (Sandbox Code Playgroud)

[*] from: …

c c++ double portability cppcheck

4
推荐指数
3
解决办法
1320
查看次数

标签 统计

c ×5

struct ×3

c++ ×2

cppcheck ×1

double ×1

gcc ×1

initialization ×1

memset ×1

portability ×1

visual-c++ ×1