2014-03-02 223 views
1
typedef struct Oft{ 
    int mode; 
    int refCount; 
} OFT; 

typedef struct proc{ 
    struct proc *next; 
    int uss, usp; 
    int pid;    // add pid for identify the proc 
    int status;    // status = FREE|READY|RUNNING|SLEEP|ZOMBIE  
    int ppid;    // parent pid 
    OFT *fd[10];  
    int kstack[1024];  // per proc stack area 
}PROC; 

我該如何初始化並使用my * fd [10]變量?指向結構體的指針陣列

假設我有

PROC *p; 

這是初始化其* FD [10]正確的方法是什麼?

for(i = 0; i < 10; i++) 
{ 
    p->fd[i] = (OFT *) malloc (sizeof(OFT)); 
    (*p->fd)[0] = Some OFT object? 
} 

爲什麼p-> fd [i]在執行以下檢查時總是等於null?

if (p->fd[i] == NULL) 
    //Do sometiong 
+1

在初始化其成員之前,您必須首先初始化'p'。同時檢查'malloc'的返回值。 – 2014-03-02 10:17:53

+0

假設我初始化了它。我不想發佈更多必要的代碼 – user3370394

回答

2
p->fd[i] = malloc(sizeof(OFT)); 

是正確的,只要您提供的p空間指向,通過使用malloc()或使其指向一些PROC變量。請注意,您不需要投射,因爲malloc()會返回一個void *,它會自動投射到任何類型的指針。但是,您應該檢查malloc()是否返回NULL

(*p->fd)[0] 

是錯誤的,會導致編譯器錯誤。如果你有一個名爲myoft的OFT對象;你可以像使用malloc一樣分配它;當然,由於FD [X]是一個指針,你想擁有的對象的地址:

p->fd[x] = &myoft; 

如果您要訪問您的OFTs之一的組成部分之一,你可以,例如,使用

p->fd[x]->refCount++; 

我不能回答最後一個問題,爲什麼if (p->fd[i] == NULL)始終是真實的,除非你提供你的代碼的一個完整的例子。

+0

如果我在函數中執行** p-> fd [x] =&myoft **,並退出該函數並在其後檢查其中一個組件,它將返回不同於我分配的!任何想法? – user3370394

+0

哦,我剛剛意識到malloc的返回值是NULL。我在malloc之後檢查了p-> fd [i],它仍然是空的! – user3370394