- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用一个包含许多成员的大型结构,我想要一种简单的方法来快速查看是否有任何成员非零。我知道 memcmp()
不应该用于比较两个结构是否相等(如下所述: How do you compare structs for equality in C? ),但我希望通过将结构与已被设置为 0,这可能有效。
例如,假设我有一些结构:
typedef struct {
int Int1;
int Int2;
int Int3;
} MyInts;
我从此结构创建一个变量:
MyInts MyStruct = {0};
在我的程序执行过程中,MyStruct
的成员通常为 0,但有时可能会暂时设置为某个非零值。我想快速检查 MyStruct
中的任何整数是否非零。我可以按如下方式使用 memcmp()
吗?
// Create empty struct to test against
MyInts EmptyStruct = {0};
// Make sure entire memory block of test struct is cleared
memset(&EmptyStruct, 0, sizeof(MyInts));
// Compare MyStruct to EmptyStruct to see if any non-zero members exist
int result = memcmp(&MyStruct, &EmptyStruct, sizeof(MyInts));
最佳答案
在一般情况下不能这样做,因为结构体可以在字段之间和结构体末尾进行填充,并且不能保证填充字节的内容(可能是未初始化的垃圾)。
如果要比较的两个结构体最初是用calloc
分配的,或者有sizeof(thestruct)
字节memset
不过,在填充实际值之前将其设置为零,那么填充将具有可预测的值,并且memcmp将起作用。同样,如果您可以保证没有填充,那么这个memcmp就可以工作。但如果其中之一可能没有归零,不,不安全。
当然,如果您想变得“友善”,您可以直接比较成员(可能是在分解函数中),然后让编译器处理优化,而不必担心是否有未清零的结构且填充 float 。
注:The second highest voted answer您提供的链接涵盖了这一点。该答案的评论还指出了一些边缘情况,例如float
可以具有比较相等但具有不同位表示形式的值,因此即使如此,它也不能推广到所有结构。
关于我可以使用 memcmp 检查结构中的非零成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40034162/
template int custom_memcmp(const T* a, const T* b, std::size_t n); 这会比 C 的 memcmp 更快吗? 如果 sizeof(T)
如果我为 memcmp 的第一个和第二个参数传递相等的指针,我怀疑它可能只是返回 0 而不检查元素——因为如果传递相同的指针,则元素必须为零。在我看来,检查指针相等性并提前退出是很好的优化。 我检查了
是 if(strncmp(buf, buf2, 7) == 0) 做同样的事情 if(memcmp(buf, buf2, 7) == 0) buf 和 buf2 是 char* 数组或类似数组。 我打
我从 fasm(版本 1.71.51)代码调用 memcmp,并且得到了奇怪的结果。 看起来memcmp只比较奇数位置的字符。代码: format ELF64 section '.text' exec
我想知道 memcmp 函数必须返回什么。 我一直在 Internet 上搜索,通常 memcmp 定义如下所示: The memcmp() function returns an integer g
如果我发送 memcmp 两个指向整数的指针,那么它似乎将整数解释为字符。 例如: int a = 5; int b = 256; int res = memcmp(&a,&b,sizeof(int)
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
struct Flat { int a1; int a2; } // a hierarchical struct which containing a struct attribute str
我正在使用一个包含许多成员的大型结构,我想要一种简单的方法来快速查看是否有任何成员非零。我知道 memcmp() 不应该用于比较两个结构是否相等(如下所述: How do you compare st
我想以最快速有效的方式找出两个内存缓冲区(保存任意定义的值)在按位比较中是否相同。 我对 bool 值“相同”以外的任何东西都不感兴趣,我希望该方法尽快返回,即首先发现差异。 实现此目标的最佳方法是什
我在使用 memcmp 时遇到了一个小问题。我有两个数组(长度 = 3 字节),数据完全相同。 如果我尝试将它们与 memcmp 进行比较,它会失败吗?! if (memcmp(ucbuffer, u
在 C 中,我想检查给定的字符数组中的任意字母,并根据它的内容进行更改。例如,字符“a”或“A”将更改为“4”(表示 4 的字符)。这是我的编码练习:) 代码如下: #include #includ
我有两个相同大小的 unsigned char 数组和一个检查它们是否相等的 if 语句: #define BUFFER_SIZE 10000 unsigned char origCh
我有一个缓冲区,还有几个指向它的指针。我想根据指针指向的缓冲区中的字节对指针进行排序。 qsort() 和 STL::sort() 可以被赋予自定义比较函数。例如,如果缓冲区是零终止的,我可以使用 s
这个问题有点难以解释,因为代码片段是一个更大项目的一部分。我会尽我所能解释这个问题。 我有两个文件 FILE *f,*m; f=fopen("/home/machine/decoder
我刚好调试了一个令人难以置信的严重错误:在我自己的 PC(Windows 7 x64,MinGw)上,我的 C 程序在比较数组成员时使用 memcmp 成功地对数组进行了排序。 我的函数使用了冒泡排序
在 C++ 中,比较两个字大小结构(例如 32 位架构中的 4 字节大小)的最有效方法(内存和时序)是什么。假设没有垃圾填充位并且: struct A, B; 一方面,我可以使用 memcmp(&A,
下面是memcmp的微软CRT实现: int memcmp(const void* buf1, const void* buf2, size_t count
下面的简单程序对我来说是段错误: #include int main() { void* voidp = NULL; char zeroes[sizeof(void*)];
我已经使用 memcmp 函数比较了两个字符串文字。 #include #include int main() { char str1[] = "abcd"; char str2[] =
我是一名优秀的程序员,十分优秀!