在struct元素上使用memset的正确方法是什么?

时间:2012-03-08 00:12:46

标签: c struct memset

我正在尝试在结构元素上使用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;

2 个答案:

答案 0 :(得分:2)

您已在行

中分配了一组指针
eargs **targs = (eargs **) malloc(p * sizeof(eargs *));

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

相反,如果你想分配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 **

答案 1 :(得分:1)

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

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

一旦你拥有结构进行操作,你的memset()电话就可以了。