gpt4 book ai didi

c - C 结构中的指针问题

转载 作者:行者123 更新时间:2023-11-30 17:26:42 25 4
gpt4 key购买 nike

我有一个关于 c 指针的问题。我目前正在构建自己的 shell。根据 valgrind 的说法,我有一个与指针有关的内存泄漏。我尝试了许多不同的方法来释放内存,但这些方法通常都会导致段错误。我的代码非常复杂,所以我不会发布它。但本质上我拥有的代码的一部分是:

void seperateCommands(char *input[]){
process *processArr[10];
char **currInstruction;
currInstruction = calloc(300 , sizeof(char *));
if(input[inputIndex] == NULL){
currInstruction[instructionIndex] = NULL;
//printString(currInstruction);
process *tempP;
tempP = (process *)calloc(1,sizeof(process));
tempP->instruction = currInstruction;
processArr[processIndex] = tempP;
processIndex++;
break;
}
}
job *j;
j = (job *) calloc(1,sizeof(job));
j->currProcess = processArr[0];

以及免费方法:

 void free_job(job* j){
int i = 0;
if(j->currProcess != NULL){
free(j->currProcess->instruction);
}
if(j->currProcess != NULL){
free(j->currProcess);
}
if(j->twoProcess){
if(j->secondProcess != NULL){
free(j->secondProcess->instruction);
free(j->secondProcess);
}
}
for (i = 0; i < 300; i++){
free(j->instruction[i]);
}
free(j->instruction);
free(j);
}

还有两个结构:

typedef struct job{
char **instruction;
struct job* nextJob; //next active
pid_t pgid; //-1 if not set
int status; //0 if running, 1 if completed, 2 if stopped
struct process* currProcess; //max of 2 with pipes
struct process* secondProcess;
char state; //'F' if forground or 'B' if background
int twoProcess;
} job;

typedef struct process{
char **instruction; //current instruction to be executed
int *inputPipe;
int *outputPipe;
char *inputFile;
char *outputFile;
int status; //status
int completed; //1 if completed
char stopped; //1 if stopped
pid_t pid; //pid of process
} process;

typedef struct job{
char **instruction;
struct job* nextJob; //next active
pid_t pgid; //-1 if not set
int status; //0 if running, 1 if completed, 2 if stopped
struct process* currProcess; //max of 2 with pipes
struct process* secondProcess;
char state; //'F' if forground or 'B' if background
int twoProcess;
} job;

不知何故,valgrind 表明 tempP 和 currProcess 没有释放。然而,由于我通过创建作业来引用这些指针,因此我最终使用 free_job 方法释放了这些值。如果我尝试添加 free(tempP) 或 free (currinstruction),则会出现段错误。任何帮助将非常感激。几个小时以来我一直在尝试不同的事情。

关于基于概念的旁注,如果我有:

char **input;
char **sample = malloc(sizeof(char*) * 30);
input = sample;
free(input)

我还需要免费 sample 吗?

最佳答案

您的意图尚不清楚,例如,在您的侧面示例中,您似乎分配了一个包含 30 个字符的 char 数组。为此,您不需要执行指针的指针,这就足够了:

char *input;
char *sample = malloc(sizeof(char*) * 30);
input = sample;
free(input)

并且您不需要释放样本,但是当您释放输入时样本将无效,因为它们引用相同的分配 block 。因此,不要尝试在“释放(输入)”之后重复使用示例

关于c - C 结构中的指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26682964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com