Ошибка сегментации при работе с двумерными строками C - PullRequest
2 голосов
/ 12 ноября 2010
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 ]

2 голосов
/ 12 ноября 2010

Поскольку строка уже является одномерным массивом, вам понадобится двухмерный массив для хранения групп групп строк, которые не связаны с самими строками, и каждый верхний элемент должен быть выделен перед использованием.

Что-то вроде:

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 голос
/ 12 ноября 2010

Ваша проблема в этой строке:

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

p[0][0] - это не строка / символ * - вы использовали% s, поэтому printf ожидает строку.p [0] [0] - это символ, первый символ в вашем первом массиве.

Использование printf("%s,%s",p[0],p[1]);

Кроме того, вы дважды скопировали строку в p [0],в p есть мусор [1].Убедитесь, что вы также скопировали из _p [1] в p [1].

0 голосов
/ 12 ноября 2010

Вот версия без использования 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...