我有一个名为SemCreate的函数,它将名称作为int,将指针作为参数。我希望指针指向一个新的结构,我想返回一个int,0如果它没问题。
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
编辑:数组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;
答案 0 :(得分:1)
你的问题并不完全清楚你要做什么。因此,这个答案解决了以下一般性主题,希望他们能提供帮助:
1)通过函数传递结构的地址,更改结构成员的值,以及在调用函数中访问更改的值。 (它与您展示的不同,但说明了您想要做的事情。)
2)创建实例和指向结构实例的指针,然后初始化
3)包含自引用结构教程的链接。 (正如您在发布的代码中所做的那样)
typedef struct {//struct definition created in global space, typedef'ed
char line[80]; //to read in the line
int slot;
char type[20]; //long enough for any types listed
int position;
}SLOT;
int modifyStruct(SLOT *slot);//prototype of demonstration function
int main(void)
{
SLOT s;//create instance of SLOT local to main
int ret = modifyStruct(&s);pass address of SLOT instance to change member values
printf("Line: %s\n", s.line);//show changed values
printf("Slot: %d\n", s.slot);
printf("type: %s\n", s.type);
printf("position: %s\n", s.position);
return 0;
}
int modifyStruct(SLOT *slot)
{
strcpy(slot->line, "lineA");
slot->slot = 2;
strcpy(slot->type, "large");
slot->position = 20;
return 0;
}
编辑 - 解决有关如何设置结构指针以指向结构的注释中的问题。
首先,从查看您发布的代码看,您正在使用自引用结构。 (即包含成员的结构,该成员是自身的指针实例)这是一个指向好的 tutorial dealing with Linked Lists in C 的链接,它使用自引用结构。
关于你评论:_我想我应该更清楚。 P1_Semaphore与信号量不同。我需要P1_semaphore指向信号量:
如果P1_Semaphore
与semaphore
不同,则不应将其设置为指向另一个的地址。无论如何,你的编译器都不允许你这样做。
正如我在评论中所说,结构指针应该只指向内存中包含该结构实例的位置。例如,考虑两个结构A&amp; B:
typedef struct {
int iNum;
float fNum;
char cStr[80];
}A;
A a, *pA; //create an instance, and pointer to an instance of A
typedef struct {
int iNum1;
int iNum2;
int iNum3;
}B;
B b, *pB; //create an instance, and pointer to an instance of B
A
&amp; B
明显不同,并且会在内存中占用不同的大小和形状,因此如果指向B
,*pB
的指针设置为指向除B
之外的任何内容,则会不正确的。它需要指向B
正确:
pA =&amp; a //设置指向A的指针等于A
的地址 pB =&amp; b //将指针设置为B等于B的地址不正确:
pA =&amp; b //将指针设置为A等于B的地址 pB =&amp; a //设置指向B的指针等于A
的地址 (典型的编译器错误 - 操作数=具有指向B的类型指针和指向A 的指针)
答案 1 :(得分:0)
在C / C ++中,所有参数都是按值传递的,而不是通过引用传递的。要在参数中获取结构指针,需要使用指针指针作为参数。像这样:
int P1_SemCreate(char *name, unsigned int value, P1_Semaphore **sem){
...
*sem = temp;
...
}