簡體   English   中英

如何使用指向結構體的指針?

[英]How to work with pointer to pointer to a struct?

我有一個問題。 我幾乎從C(從C#背景開始)入手,而我卻遇到了雙指針問題。

我的結構如下:

#ifndef __PROCESSINFO_H
#define __PROCESSINFO_H

struct ProcessInfo
{
   int ProcesId;
   int Priority;
   int ExecutionTime;
   int EllapsedTime;
   char* ProcessName;
}; 

struct ProcessInfo *ProcessInfo_Allocate(int processId, char *processName, int priority, int executionTime);
void ProcessInfo_ToString(struct ProcessInfo *processInfo);
void ProcessInfo_Dispose(struct ProcessInfo *processInfo);

#endif

實現方式:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "processinfo.h"

struct ProcessInfo *ProcessInfo_Allocate(int processId, char *processName, int priority, int executionTime)
{
    struct ProcessInfo *processInfo;
    processInfo = (struct ProcessInfo *)malloc(sizeof(struct ProcessInfo));
    processInfo->ProcessId = processId;
    processInfo->ProcessName = processName;
    processInfo->Priority = priority;
    processInfo->ExecutionTime = executionTime;
    processInfo->EllapsedTime = 0;

    return processInfo;
}

void ProcessInfo_ToString(struct ProcessInfo *processInfo)
{
    printf(" %6i %6i %10i %10i, %25s", processInfo->ProcessId, processInfo->Priority, processInfo->ExecutionTime, processInfo->EllapsedTime, processInfo->ProcessName); 
}

void ProcessInfo_Dispose(struct ProcessInfo *processInfo)
{
    if(processInfo != NULL)
    {
        if(processInfo->ProcessName != NULL)
        {
            free(processInfo->ProcessName);
        }

        free(processInfo);
    }
}

所以現在我必須管理很多ProcessInfo實例。 我寫了另一個結構,該結構包含一個指向ProcessInfo結構的指針,因為我認為我可以根據需要增加或減小它的大小(而不必太麻煩)。

#ifndef __SCHEDULER_H
#define __SCHEDULER_H

struct Scheduler
{
    struct ProcessInfo** Processes;
};

struct Scheduler* Scheduler_Allocate(void);

#endif

所以問題是如何在Scheduler_Allocate方法內初始化** Processes成員? 我如何添加東西?

您不需要雙指針來增加/減小大小。 只需使用普通的指針並重新realloc

struct ProcessInfo* processes = malloc(sizeof(struct ProcessInfo) * 2);
struct ProcessInfo* processes_tmp;

if (!processes) {
   /* bail */
}

/* do whatever with processes[0] and [1] */

processes_tmp = processes;
processes = realloc(processes, sizeof(struct ProcessInfo) * 5);
if (!processes) {
    free(processes_tmp);
    /* bail */
}

/* processes[0] and [1] are unchanged, and [2] [3] and [4] are now valid */

然后,除了創建ProcessInfo_Allocate ,您可以創建一個ProcessInfo_Init ,除了不分配內存外,該過程將執行大多數相同的操作:

int ProcessInfo_Init(struct ProcessInfo *pi, int processId, char *processName, int priority, int executionTime)
{
    if (!pi) {
        return -1;
    }
    pi->ProcessId = processId;
    pi->ProcessName = processName;
    pi->Priority = priority;
    pi->ExecutionTime = executionTime;
    pi->EllapsedTime = 0;

    return 0;
}
struct Scheduler s;
s.Processes = malloc(sizeof(struct ProcessInfo*) * size);
s.Processes[0] = ProcessInfo_Allocate(...);

// Add more items:
s.Processes = realloc(malloc(sizeof(struct ProcessInfo*) * (size + 1));
s.Processes[size] = ProcessInfo_Allocate(...);
size++;

也可以在這里查看我的示例:

C結構數組

size_t size = 10;//or what ever is the number of processes
struct ProcessInfo * process = (struct ProcessInfo *)malloc(size * sizeof(struct ProcessInfo));
if(!process)
    //perhaps stop program? Do something
Processes = &process;
//later on
int i;
for(i = 0; i < size; i++)
{
   printf("Process id =%d",Processes[i]->ProcesId);
   etc
}

指向指針的指針被初始化為指針數組。 因此,調用malloc(count * sizeof(ProcessInfo*))進行初始化。 這樣,您將獲得指向ProcessInfo的指針數組。 然后多次調用malloc(sizeof(ProcessInfo))創建特定的ProcessInfo結構,並將指向它們的指針放入數組。

另外,user470379是對的,您不需要指向指針的指針就可以更改數組中的項數。 但是您的想法實際上也不錯,可以根據需要堅持下去。

另外,由於您熟悉C#,因此建議您從用C編寫類似ArrayList的內容開始。然后,可以在許多情況下使用它(例如這種情況)。

首先將您的定義更改為:

typedef struct Scheduler {
    struct ProcessInfo** Processes;
} Scheduler;

然后是這樣的:

Scheduler *s;
s = malloc(sizeof(Scheduler));
if (s == NULL) {
  exit(-1);
}
s = memset(s, 0, sizeof(Scheduler));
/* Or enter your own memory allocation stuff here */
i = 0; /* Or use some other number */
s->Processes[i] = someProcessInfo;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM