2013-09-26 36 views
0

最近,我試圖在C上做出一個良好的實踐,現在我開始執行一個命令。 它告訴我,我應該char**?但我有一些概念錯誤嗎?在execvp中實現一個shell:錯誤的參數()

請幫幫我。 代碼在這裏

int excution(int cnt, char token[][BUFSIZE],int *t_token) 
{ 
    setenv ("PATH", "/bin:/bin/usr:", 1); 
    //printf("%s",getenv("PATH")); // check environement 
    const char *b_cd="cd"; 
    const char *b_exit="exit"; 
    const char *b_fg="fg"; 
    const char *b_jobs="jobs"; 
    int i,j,k; 
    //STEP 9:excute normal commanand 
    char args[cnt][BUFSIZE]; 
    for(i=0;i<MAXARG;i++) 
    { 
     if(t_token[i]==COMMAND) 
     { 
      strcpy(args[0],token[i]); // copy 1st ARG 
      j=1; 
      while(t_token[i+1]==ARG) 
      { 
       strcpy(args[j],token[i+1]); 
       i++; 
       j++; 
      } 
      for(k=0;k<j;k++) 
      { 
      printf("%s\n", args[k]); 
      } 
      execvp (args[0], args); 
     } 
    } 

它給我警告編譯。但它給分段錯誤如果更改2D陣列到char** ....

警告:從兼容的指針類型 傳遞「execvp」的參數2 [默認啓用] /usr/include/unistd.h :579:12:注:預計 'char * const的*',但參數的類型爲 'CHAR(*)[256]'

+0

segfault必須發生,因爲您在那裏做了其他*錯誤。看到這個問題:http://www.cplusplus.com/forum/general/51468/ - 並請顯示您的失敗代碼。 – usr2564301

回答

1

也許我是老了,但是當我看到焦炭變種[X] [Y]我想編譯器會分配一大塊內存的sizeof(char)的* X * Y然後變種[I]將等於變種+(I * Y *(的sizeof(char)的))。只要大家都知道Y是什麼,一切都很酷。但是execvp()不知道您的X & Y尺寸。

相反,字符*變種[X]會給我X指針每個的sizeof(字符*)的陣列,或的sizeof的存儲器中的二進制大對象(字符*)* X

現在char的通常是1個字節。 char *通常是4或8個字節,但可以根據您的系統而有所不同。

所以的char *變種[X]可能是一塊內存X * 8個字節大小,和任何人都接受VAR作爲一個參數就知道如何訪問各種char *作爲指針大小的指針在編譯器中是衆所周知的,它只是一個標準偏移量。

在另一方面,任何人都接受焦炭變種[X] [Y]將是真糊塗。沒有辦法知道一個參數結束的地方,另一個開始於那個巨大的記憶中。

長話短說:使用char * args [SIZE];,使用ARG [I] = 「命令」ARG [I] =記號[j]的,並瞭解指針。

p.s. char **是指向char的指針。 (也就是說,8字節指向另一個8字節數據的存儲地址,它包含char(1字節)值的內存地址。當我們談論將字符串存儲爲空字符時,這更有意義(char( 0))字符數組 - 例如順序存儲的字符,所以如果我們知道字符串中第一個字符的地址,我們可以遞增指針以獲取下一個字符,直到我們輸入零,空字符'\ 0'。)

它與指向char的指針數組類似,但不完全相同。 (也就是說,8個字節指向的內存地址至少包含8個字節的數據,可能是N * 8個字節的連續內存地址(指針)。再次,就像連續字符數組一樣,我們可以有一個數組的字符*,存儲一前一後在內存中。)

這將是更準確的說一個字符**大致等於一個字符* [N] ,只有char **不會爲我分配任何內存nternal 字符*指針而字符* [N]並 - 它對於N 字符*指針分配空間。

當接收指針數組爲char(字符* []),則可以聲明爲指針的指針爲char(字符**),並且仍然通過陣列迭代。你只需要在指針指向的位置(傳入)找到正確的內存塊(數據)。