2012-03-08 50 views
1

我试图用memset的一个结构元素,像这样:在结构元素上使用memset的正确方法是什么?

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

但是,这样做让我分割故障。我不明白为什么这是失败的,也不知道如何让它工作。 在结构的元素上使用memset的正确方法是什么?为什么我的方法不起作用?

线,其分配用于targs存储器:

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

结构定义为结构体元件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; 
+4

不要在C程序中从'malloc()'强制返回值。 – 2012-03-08 00:14:45

+1

初始化* targs的代码在哪里? – 2012-03-08 00:17:20

+0

@HansPassant - 它不在那里,可能是这个问题。 – 2012-03-08 00:19:20

回答

2

您已分配的指针的数组在线

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

但您尚未初始化元素本身。因此,这段错误与在结构字段中正确使用memset无关,而是从使用初始化内存(假设在分配指针数组后没有循环来初始化每个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 **

+0

我想你想''args [i] .cs'如果你是这样创建数组。 – 2012-03-08 00:20:07

+0

@CarlNorum你是对的。固定。 – 2012-03-08 00:21:01

1

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

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

一旦你真正结构进行操作,你的memset()电话应该罚款。

相关问题