2012-03-08 57 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()電話應該罰款。

相關問題