小编Ans*_*mpe的帖子

如何检查内存块中的所有字节是否为零

我有一块内存块,其中包含固定大小的元素,比如说100个字节,一个接一个地放入,所有内容都有相同的固定长度,所以内存看起来像这样

<element1(100 bytes)><element2(100 bytes)><element3(100 bytes)>...
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我需要确定某个元素的所有字节是否都设置为0字节,因为它具有特殊含义(我没有说这是一个好主意,但这就是我所处的情况).

问题是,我该如何有效地做到这一点.进一步:有一个简单的功能来做到这一点.为了将字节设置为零,我可以使用memset或bzero,但我不知道检查零的任何函数.

目前我正在使用循环进行检查

char *elementStart = memoryBlock + elementNr*fixedElementSize;
bool special = true;
for ( size_t curByteNr=0; curByteNr<fixedElementSize; ++curByteNr )
{
  special &= (*(elementStart+curByteNr)) == 0;
}
Run Code Online (Sandbox Code Playgroud)

当然,我可以使用更大的偏移量循环,并使用mword或其他更适合的更大类型一次检查几个字节.我想这样会很有效率,但我想知道是否有一种功能可以减轻我的负担.

建议功能:

  • !memcmp(compareBlock,myBlock,fixedElementSize)

c++

26
推荐指数
3
解决办法
3万
查看次数

在初始化中使用新声明的变量(int x = x + 1)?

我偶然发现了令我惊讶的行为:

写作时:

int x = x+1;
Run Code Online (Sandbox Code Playgroud)

在C/C++程序中(或者涉及新创建的变量x的更复杂的表达式),我的gcc/g ++编译没有错误.在上述情况下,X之后为1.请注意,前一个声明的范围中没有变量x.

所以我想知道这是否是正确的行为(甚至可能在某些情况下有用)或者只是我的gcc版本或gcc的解析器pecularity.

顺便说一句:以下不起作用:

int x++;
Run Code Online (Sandbox Code Playgroud)

c c++ initialization undefined-behavior

9
推荐指数
3
解决办法
3060
查看次数

标签 统计

c++ ×2

c ×1

initialization ×1

undefined-behavior ×1