- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在一个 C/C++ 混合项目中,我发现了一些我可以简化为的代码
#include <mem.h>
struct StructContainingDouble
{
double d;
/// other elements omitted
};
void clear(StructContainingDouble* p)
{
memset(p, 0, sizeof *p);
}
不停止 Cppcheck 以引发可移植性警告
Using memset() on struct which contains a floating point number.
消息是正确的,但是由于 float 被声明为 double ,所以它似乎是误报,因为在 double 中,(正)零值是按照 IEEE 754 标准编码的:[*]
0 00000000000 0000000000000000000000000000000000000000000000000000
所以我倾向于简单地抑制警告并忘记它
void clear(ContainingDouble* p)
{
// cppcheck-suppress memsetClassFloat
memset(p, 0, sizeof *p);
}
但也许这里真的存在可移植性问题?
实际代码基于Win32平台。该结构用于管理对 shared memory 的访问,这就是构造函数无用的原因。不仅该结构的一个对象必须归零,而且它的一个数组嵌入到另一个结构中,如下所示:
#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);
}
最佳答案
有问题吗?是的。不,不是真的。一个非常遥远的也许。
正如 interjay 在评论中指出的那样,C 不强制要求浮点值的格式。因此理论上“零”可能是无效值或不代表零。
所有具有 FPU 的现代平台都实现 IEEE 754。任何(可能是嵌入式)系统都不会在其库中实现 IEEE 754(除非它是退化的实现并且根本没有浮点...)。
因此,虽然不能保证您在这里遇到问题的可能性很小。在一些平台上存在关于它们如何精确地符合 IEEE 754 信件的细节问题,但之前曾问过但从未得到任何答案我会很高兴看到一个平台,其中 memset()
带零的 double 不会将其设置为零值。
就是说,如果您开始将 double up 切碎但使用 0 则不要忘记字节序,这不是问题。
请记住 C 已经接近 50 岁了,现在几乎普遍存在的东西,例如一个字节是 8 位,还没有确定下来,我认为这是正确的,为了提供最大的支持(不要忘记嵌入式)它是从未 promise 遵守这些标准。
在偏执狂模式下你可以:
memset(&obj,0,sizeof obj);
#ifndef __STDC_IEC_559__
obj.dbl_val=0.0;
#endif
其中 dbl_val
是 obj
的 double
成员。然而,未定义的唯一可能原因不是因为 block 归零不是零,而是标准的其他一些优点没有完全实现。
关于c++ - 在包含 float 的结构上使用 memset(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45481484/
在互联网上浏览代码时,我经常看到这样的片段: struct epoll_event event; memset(&event, 0, sizeof(event)); 如果事件填写完整,这种模式对我来说
我不认为我在这里理解了什么...... bool (*lookup)[100]; memset(lookup, 0, 100 * sizeof(*lookup)); 我正在尝试初始化一个指向堆栈分配数
我从以前退休的开发人员那里继承了一些代码。我的问题具体是在以下场景中使用 memset。不是 c 程序员,我想知道为什么在这种特殊情况下使用 memset,其中下一行代码将值存储在刚刚被 memset
如何在 jsctypes 中使用 memset。没有对应的 DLL。我搜索/搜索了 js ctype 代码,但找不到要破解的示例。 最佳答案 如果您只想将数组memset为零字节,那么我有“好消息,大
在尝试重新创建“memset”函数时,如果我尝试取消引用 void 指针,或者第二个参数的类型与第一个参数的类型不同,则会出现错误。为了使该功能正常工作,我必须将其更改为: void ft_memse
我关注了How to memset char array with null terminating character?在使用 C memset api 时添加空终止符。 代码有效;由于空终止符,我
这个问题在这里已经有了答案: Calloc with structure with pointers in C (3 个答案) 关闭 7 年前。 考虑以下对 void 指针数组的初始化: #incl
我写了这段代码: #include int main(void) { char c[10]=""; //Q if(c[2]=='\0')
我正在尝试为 2D 矩阵分配内存,但出现段错误。 int** inicializarMatriz(int **matriz, int vertices){ int i; matriz=(int**)
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
这给我带来了 memset 的段错误,我不知道为什么,我要访问 2D 数组的特定索引,这应该给我一个 char 指针并允许我使用 memeset。 void test(char** test) {
我正在尝试增长一个数组以添加新的 malloc 指针。 realloc 似乎并没有增加大小。另外,我一开始就为数组中的一个指针提供了足够的空间,因此即使 realloc 没有增加大小,我仍然希望能够复
我正在用 C 语言做一个关于 UDP 套接字的练习。当客户端发送特定消息(例如 hi)时,服务器必须发送“很高兴见到你”。如果没有找到标准回复,服务器将发送“没有合适的回复”。我的问题是memset如
由于memset采用字符串或数组的地址并将它们视为字符缓冲区。 它如何知道必须分配的给定值应该以 1 字节(字符)为一组还是以 4 字节为一组进行分配(整数)。 最佳答案 但事实并非如此。在第三个参数
我想避免使用memset()在这样的结构上: typedef struct { int size; float param1; } StructA; typedef struct {
我有以下一组代码,无法找到为什么我得到垃圾值。我的目的是将字节数复制为目标,而不考虑源,以便为我的应用程序制作通用副本。但没有得到正确的结果。有什么办法可以实现这一点。 int main() {
我定义了一个结构体,以及一个接受结构体指针并填充相关信息的函数,同时在开始时进行空检查。 粗略示例: typedef struct { int field; } myStruct; void my
我在编写一个函数来从文件中提取字符串作为更大程序的一部分时遇到一些问题。一切似乎都工作正常,除了当我使用 memset 或 bzero 来删除我一直在使用的字符数组时。我已经解决这个问题一个多小时了,
void readdat (int c, char **v) { char *dc; char *pdc; dc = malloc((line+1) * sizeof(char)); memset(d
我有一个指向数组的指针。我知道该数组可以容纳多少个项目,但每个项目的长度是动态的。那么在这种情况下如何memset()数组。 Int8 *data[4]; //array can hold maxim
我是一名优秀的程序员,十分优秀!