Q:

Генерация массива строк в С

Задача состоит в том, чтобы создать массив всевозможных строк типа "1+2+3+4+5+6+7+8+9", "12-3+4+567-89" и т.д., т.е. между цифрами может стоять плюс, минус либо вовсе ничего.
В соответствии с правилами задания вопросов в StackOverFlow, прилагаю свой ошибочный фрагмент кода:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
  char *arr[6561];
  char symbols[3] = {' ', '+', '-'};

  for(int i = 0; i < 6561; i++)
  {
    arr[i] = "1 2 3 4 5 6 7 8 9";
  }

  for(int i = 0; i < 6561; i++)
  { 
    int index = 1;

    for(int j = 0; j < 9; j++)
    {
      strcpy(&arr[i][index], &symbols[i % 3]);
      i /= 3; index += 2;
    }
  }

  printf("%s", arr[4]);
}

При выполнении этой программы я получаю segmentation fault. 

A:

Элементарно, Ватсон!
char arr[6561][18];

int main(int argc, const char * argv[])
{
    char s[]   = "1 2 3 4 5 6 7 8 9";
    char sig[] = " +-";
    for(int i = 0; i < 6561; ++i)
    {
        for(int j = 0, n = i; j < 8; ++j)
        {
            s[j*2+1] = sig[n%3];
            n/=3;
            printf("%s\n",s);
            strcpy(arr[i],s);
        }
    }
}

