试图设置指向结构的指针

时间:2017-02-22 01:29:30

标签: c pointers

我有一个名为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;

2 个答案:

答案 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_Semaphoresemaphore不同,则不应将其设置为指向另一个的地址。无论如何,你的编译器都不允许你这样做。

正如我在评论中所说,结构指针应该只指向内存中包含该结构实例的位置。例如,考虑两个结构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;
  ...
}