处理二维C字符串时出现分段错误

时间:2010-11-12 20:31:20

标签: c string

char *input[2]; 

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

我正在尝试创建一个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 

我们怎么做?

// 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 

3 个答案:

答案 0 :(得分: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";
...

答案 1 :(得分:1)

你的问题就在这一行:

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

p[0][0]不是字符串/ char * - 你使用了%s,所以printf需要一个字符串。 p [0] [0]是一个char,是第一个数组中的第一个字符。

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

另外,你已经将一个字符串复制到p [0]两次,p [1]中有垃圾。确保从_p [1]复制到p [1]。

答案 2 :(得分: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;
}