简体   繁体   中英

Trying to set a pointer to a struct

I have a function called SemCreate that takes a name an int and a pointer as parameters. I want the pointer to point to a new struct and I want to return an int, 0 if it went okay.

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;

}

Right now the pointer is fine within the function but once I return the pointer is null

EDIT: The array semTable is an array of semaphores

    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;

Your question is not perfectly clear as to what you are trying to do. So, this answer addresses the following general topics in hopes they will assist:

1) Passing the address of a struct via a function, changing the values of the struct members, and accessing changed values in calling function. (It is not the same as the one you show, but illustrates what you want to do.)
2) Creating instances and pointers to instances of a struct, then initializing.
3) Contains link to tutorial on self referencing structs. (as you are doing in your posted code)

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;
}

EDIT - To address question in comment asking how to set a struct pointer to point to a struct.

First, it appears from viewing the code you have posted, that you are using self referencing structs. (ie a struct that contains a member that is a pointer instance to itself) Here is a link to a good tutorial dealing with Linked Lists in C , which use self referencing structs.

Regarding you comment: _I guess I should have made it more clear. P1_Semaphore is different to semaphore. I need P1_semaphore to point to the semaphore_.:

If P1_Semaphore is different than semaphore , then one should not be set to point to the address of the other. And your compiler will not let you do that anyway.

As I stated in the comments, a struct pointer should only point to a place in memory that contains an instance of that struct. For example consider the two structs A & 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 & B are obviously different, and will occupy a different size and shape in memory, so if the pointer to B , *pB was set to point to anything but B , it would be incorrect. It needs to point to B

Correct:
pA = &a //set pointer to A equal to the address of A
pB = &b //set pointer to B equal to the address of B

Incorrect:
pA = &b //set pointer to A equal to the address of B
pB = &a //set pointer to B equal to the address of A
(typical compiler error - Operands of = have types pointer to B and pointer to A )

In C/C++, all parameters are passed by value, not by reference. To get the struct pointer in parameter, you need to use pointer to pointer as the parameter. Like this:

int P1_SemCreate(char *name, unsigned int value, P1_Semaphore **sem){
  ...
      *sem = temp;
  ...
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM