在结构元素上使用 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 的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用 sequelize N:M 关联实现“平坦”结果的“正确”方法是啥