2017-09-30 11 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