2017-09-30 9 views
0

当我运行我的代码第一printParams()呼叫完美的作品。但每次调用fork()struct失去其所有的char数组值。我并不熟悉指针,但我可以说这个问题的根源可能是基于指针的。例如,第一printParams()将打印出所有在Parse()功能分配的值的。但fork()后,所有的整数值如backgroundargumentCount的显示,但没有或具有inputRedirect相关联的字符串值的字符串值的vectorArguments阵列中保持。我正在写在C外壳和我有指针麻烦字符数组的结构

Here is a photo of my ouput]

#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 arguement 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; 
} 
+3

所有char *缓冲区main通话结束如果你的代码砍倒表现出你会得到更好的帮助 –

+1

顺便说一句什么parse.h中的内容的问题最小的尺寸? –

+0

指针*只是指向某处,它*不能保持指向的数据。 – alk

回答

0

的原因,你失去所有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()这会导致内存泄漏。

Sugestion:

main创建结构的静态实例,并给它的指针Parse功能。

Param_t testParam; 
Parse(&testParam); 

Parse功能填充它。并免费为内部testParam

+0

为什么不直接使用'的strcpy(''的的memset/memcpy'代替)? – alk