2014-03-02 316 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