2010-11-12 43 views
2
char *input[2]; 

input[0] = cat /etc/passwd 
input[1] = grep root 

我試圖創建C字符串,從而分段故障在處理2個維C字符串

char **dArray; 

dArray[0][0] = cat 
dArray[0][1] = /etc/passwd 
dArray[0][2] = NULL // Append NULL to mark end 


dArray[1][0] = grep 
dArray[1][1] = root 
dArray[1][2] = NULL // Append NULL to mark end 

我們如何做這2維數組?

// My Code 

char **p ; 
char *_p[2]; 

_p[0] = cat /etc/passwd 
_p[1] = grep root 

p = malloc(2 * sizeof(char*)); 

for(i=0; i<2 ;i++){ 
    p[i] = malloc(20 * sizeof(char)); 
} 

strcpy(p[0],_p[0]); 
strcpy(p[0],_p[0]); 

printf("%s,%s",p[0][0],p[1]); // I except the output cat,grep root 
+2

安置自己的實際代碼。這甚至沒有接近編譯,所有的反引號。 – 2010-11-12 20:38:15

+0

@Adam - 發佈。 – 2010-11-12 20:43:15

+0

沒辦法它與代碼中'字符編譯即反引號提到 – Mark 2010-11-12 20:56:25

回答

2

既然字符串已經是一個1個維數組,你將需要一個2維的一個串組的存儲組不相關的字符串本身和每個頂級元素應該在使用前進行分配。

喜歡的東西:

char ***dArray = malloc(sizeof(char**)*2); 

dArray[0] = malloc(sizeof(char*)*3); 

dArray[0][0] = "cat"; 
dArray[0][1] = "/etc/passwd"; 
dArray[0][2] = NULL; 

dArray[1] = malloc(sizeof(char*)*3); 

dArray[1][0] = "grep"; 
... 
+0

我寫它,你最初做的方式。我會嘗試用char ***。直到發生這種事情,我認爲我在指針方面很體面。 – 2010-11-12 20:44:29

1

你的問題是這樣的一行:

printf("%s,%s",p[0][0],p[1]); 

p[0][0]不是字符串/字符* - 你已經使用%S,所以printf的預期的字符串。 p [0] [0]是char,第一個數組中的第一個字符。

使用printf("%s,%s",p[0],p[1]);

此外,您複製一個字符串轉換爲P [0]兩次,有垃圾在P [1]。確保你從_p [1]複製到p [1]。

0

這裏是不使用malloc版本。

#include <stdio.h> 

const char *cmd1[] = { "cat", "/etc/passwd", NULL }; 
const char *cmd2[] = { "grep", "root", NULL }; 
const char **dArray[] = { cmd1, cmd2, NULL }; 

int main(void) 
{ 
    for (const char ***cmd = dArray; *cmd; cmd++) { 
    printf("command\n"); 
    for (const char **arg = cmd[0]; *arg; arg++) { 
     printf(" argument %s\n", *arg); 
    } 
    } 
    return 0; 
}