私は、名前とポインタをパラメータとして持つSemCreateという関数を持っています。私は新しい構造体を指すポインタをしたいと私は大丈夫になった場合は0、intを返すしたい。構造体へのポインタを設定しようとしています
int P1_SemCreate(char *name, unsigned int value, P1_Semaphore *sem){
USLOSS_Console("Create a semaphore\n");
if(!verifyKernel()) {
//USLOSS_Console("ERROR: Not currently in Kernel mode\n");
USLOSS_Halt(1);
}
if(numSems>= P1_MAXSEM){
//USLOSS_Console("ERROR: MAX semaphore already exist\n");
return -2;
}
if(name == NULL){
return -3;
}
interruptsOff();
int i;
for (i = 0; i < P1_MAXSEM; i++) {
if (semTable[i].inUse == 0) {
semTable[i].value = value;
semTable[i].list = NULL;
semTable[i].name = malloc(sizeof(char));
strcpy(semTable[i].name, name);
semTable[i].inUse = 1;
semaphore *temp = NULL;
temp = malloc(sizeof(semaphore));
temp->value = value;
temp->list = NULL;
temp->name = malloc(sizeof(char));
strcpy(temp->name, name);
*sem = temp;
break;
}
}
numSems++;
interruptsOn();
return 0;
}
右は今、ポインタは関数内で結構ですが、私は返す一度ポインタがNULLである
EDIT:配列semTableは、セマフォの配列です
typedef struct semaphore{
int value;
char * name;
struct node *list;
int checkPoint;
int inUse;
}semaphore;
typedef struct PCB {
USLOSS_Context context;
int (*startFunc)(void *); /* Starting function */
void *startArg; /* Arg to starting function */
int pid;
int status;
int killedStatus;
int state;
int priority;
char name[50];
int parentPID;
int numOfChild;
int blockFlag;
struct sempahore *blockSem;
char *stack;
struct node *children;
struct node *zombiList;
int cpuTime;
int startTime;
struct semaphore *childSem;
} PCB;
typedef struct node {
PCB *pcb;
struct node *next;
} Node;
あなたの関数の本体に表示される唯一の構造体は 'semTable'ですが、作成された場所は表示されません。着信関数の引数には 'P1_Semaphore * sem'が含まれますが、' sem'!= 'semTable'です。関連するすべての部分を含めるようにコードスニペットを修正します。 – ryyker
'name'に1バイトを割り当ててもよろしいですか? 1文字しか保持できません。そして、常に[mcve]を投稿してください。 –
'P1_Semaphore'とは何ですか? 'セマフォ'とはどう違うのですか? –