[英]What is the proper way to use memset on a struct element?
我试图在结构元素上使用memset,如下所示:
memset( &targs[i]->cs, 0, sizeof( xcpu ) );
但是,这样做会给我一个分段错误。 我既不明白为什么会失败,也不知道我怎么能让它发挥作用。 在结构元素上使用memset的正确方法是什么,为什么我的方法不起作用?
为targs分配内存的行:
eargs **targs = (eargs **) malloc(p * sizeof(eargs *));
struct element cs(xcpu_context)和struct targs(execute_args)的结构定义:
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;
您已在行中分配了一组指针
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 **
。
您的内存分配行不为任何结构分配任何内存,仅用于指向结构的指针。 如果要为整个数组分配内存,则需要添加一个循环来为结构本身分配内存:
for (i = 0; i < p; i++)
targs[i] = malloc(sizeof(eargs));
一旦你真的有结构来操作,你的memset()
调用应该没问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.