2010-11-12 53 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; 
}