gpt4 book ai didi

c - 我正在用 C 编写 shell,但在结构体中指向 char 数组的指针时遇到问题

转载 作者:行者123 更新时间:2023-11-30 16:40:50 27 4
gpt4 key购买 nike

当我运行代码时,第一个 printParams() 调用工作正常。但是 fork() 之后的每次调用 struct 都会丢失其所有 char 数组值。我对指针不太了解,但我可以看出这个问题的根源可能是基于指针的。例如,第一个 printParams() 将打印出 Parse() 函数中分配的所有值。但在 fork() 之后,所有整数值(例如 backgroundargumentCount)都会显示,但不会显示与 关联的字符串值>inputRedirectvectorArguments 数组中保存的字符串值。

![这是我输出的照片]] 1

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include "parse.h"

void printParams(Param_t * param);

struct PARAM
{
char *inputRedirect; /* file name or NULL */
char *outputRedirect; /* file name or NULL */
int background; /* ethier 0 (false) or 1 (true) */
int argumentCount; /* number of tokens in argument vector
*/
char *argumentVector[MAXARGS]; /* array of String */
};

typedef struct PARAM Param_t;

int main(int argc, char *argv[]){
int i;
int debug;
pid_t pid;

if(argc>1){
if(!strcmp(argv[1], "-debug"))
debug = 1;
}

Param_t * testParam = Parse();

if(debug == 1){
printParams(testParam);
}

pid = fork();
printParams(testParam);

if(pid == 0){
exit(1);
}
return 0;
}

void printParams(Param_t *param)
{
int i;

printf("InputRedirect: [%s]\n", (param->inputRedirect != NULL) ? param-
>inputRedirect: "NULL");
printf("OutputRedirect: [%s]\n", (param->outputRedirect != NULL) ?
param->outputRedirect: "NULL");
printf ("Background: [%d]\n", param->background);
printf ("ArgumentCount: [%d]\n", param->argumentCount);

for (i = 0; i < param->argumentCount; i++)
printf("ArgumentVector[%2d]: [%s]\n", i, param->argumentVector[i]);
}

Param_t* Parse(){
char *toke[MAXARGS];
int i = 0;
char str[MAXSTRLENGTH];
int j;
int k=0;

Param_t* testParam = malloc(sizeof(Param_t));
testParam->argumentCount = 0;

printf("Enter your commands:\n");
fgets(str, MAXSTRLENGTH, stdin);

toke[i] = strtok(str, " ");

//Tokenizes the user input into the toke array
while(toke[i] != NULL){
//printf("%s\n", toke[i]);
++i;
toke[i] = strtok(NULL, " ");
}

i=0;
char c;

while(toke[i] != NULL){
c = toke[i][0];
if(c == '<')
{
for(j=0; j<strlen(toke[i]); ++j ){
toke[i][j] = toke[i][j+1];
}
testParam->inputRedirect = toke[i];
}
else if(c == '>')
{
for(j=0; j<strlen(toke[i]); ++j ){
toke[i][j] = toke[i][j+1];
}
testParam->outputRedirect = toke[i];
}
else if(c == '&')
{
testParam->background = 1;
//background
}
else
{
testParam->argumentVector[k] = toke[i];
k++;
//save as cmd vector
}
++i;
}
testParam->argumentCount = k;
return testParam;
}

最佳答案

丢失所有 char * 值的原因是 strtok() 函数不创建缓冲区。基本上,您的所有 char* 都包含一个指向您使用 fgets() 读取的 str 变量的地址。 str 变量的作用域仅限于 Parse() 函数的末尾。

解决方案:

替换:

testParam->inputRedirect = toke[i];

与:

testParam->inputRedirect = malloc(MAXSTRLENGTH);
memset( testParam->inputRedirect, 0, MAXSTRLENGTH);
memcpy( testParam->inputRedirect, toke[i], strlen(toke[i]) );

但请注意,这会导致内存泄漏,因为没有 free()

建议:

main中创建结构的静态实例,并将其指针指向Parse函数。

Param_t testParam;
Parse( &testParam );

Parse函数填充它。在 main 结束时,对 testParam

内的所有 char * 缓冲区调用 free

关于c - 我正在用 C 编写 shell,但在结构体中指向 char 数组的指针时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46498889/

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