在结构元素上使用 memset 的正确方法是啥?

Posted

技术标签:

【中文标题】在结构元素上使用 memset 的正确方法是啥?【英文标题】:What is the proper way to use memset on a struct element?在结构元素上使用 memset 的正确方法是什么? 【发布时间】:2012-03-08 00:12:46 【问题描述】:

我正在尝试在这样的结构元素上使用 memset:

memset( &targs[i]->cs, 0, sizeof( xcpu ) );

但是,这样做会给我一个分段错误。我既不明白为什么会失败,也不明白如何让它发挥作用。 在结构的元素上使用 memset 的正确方法是什么,为什么我的方法不起作用?

为目标分配内存的行:

eargs **targs = (eargs **) malloc(p * sizeof(eargs *));

struct element cs (xcpu_context) 和 struct targs (execute_args) 的struct 定义:

typedef struct xcpu_context 
  unsigned char *memory;              
  unsigned short regs[X_MAX_REGS];    
  unsigned short pc;                  
  unsigned short state;              
  unsigned short itr;                 
  unsigned short id;                 
  unsigned short num;                 
 xcpu;

typedef struct execute_args 
    int ticks;
    int quantum;
    xcpu cs;
 eargs;

【问题讨论】:

不要在 C 程序中转换来自 malloc() 的返回值。 初始化 *targs 的代码在哪里? @HansPassant - 它不存在,大概就是这个问题。 是的,这正是问题所在。不知道我是如何忘记这样做的,以及我在检查我的代码时是如何错过它的。 定义 != 声明 :) 【参考方案1】:

你已经在行中分配了一个指针数组

eargs **targs = (eargs **) malloc(p * sizeof(eargs *));

但您还没有初始化元素本身。因此,此段错误与在结构的字段上正确使用 memset 无关,而是源自使用 uininitialized 内存(假设您在分配指针数组后没有循环来初始化每个 eargs 对象)。

相反,如果您想分配 p eargs 对象的动态数组(我在这里松散地使用术语“对象”),您可以编写

eargs *args = malloc(p * sizeof(eargs));
if (!args) 
    /* Exit with an error message */

memset(&(args[i].cs), 0, sizeof(xcpu));

相反。请注意,args 是一个动态分配的 eargs 对象数组,不是一个动态分配的指针数组,所以它的类型是 eargs * 而不是 eargs **

【讨论】:

如果您以这种方式创建数组,我认为您需要 &args[i].cs【参考方案2】:

您的内存分配行不为任何结构分配任何内存,只为指向结构的指针分配内存。如果要为整个数组分配内存,则需要添加一个循环来为结构本身分配内存:

for (i = 0; i < p; i++)
    targs[i] = malloc(sizeof(eargs));

一旦你真正结构可以操作,你的memset()调用应该没问题。

【讨论】:

以上是关于在结构元素上使用 memset 的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中从内存中清除敏感数据的正确方法是啥?

使用 memset 初始化指针元素的二维数组

使用 sequelize N:M 关联实现“平坦”结果的“正确”方法是啥

在 C++ 中使用 memset 初始化具有不同值的结构数组元素

在结构中存储不可变路径的正确方法是啥?

在 Rust 中使用带有结构的生命周期的正确方法是啥?