Я вижу несколько проблем с вашим кодом. Массивы и указатели в C могут сбивать с толку, поэтому следует помнить о нескольких правилах:
char x [n] может автоматически преобразовываться компилятором C в char * x.
char x [10] [20] представлен под капотом как одномерный массив, а компилятор вычисляет смещения за кулисами. Например, если x был массивом 10 x 20, выражение x [1] [2] могло бы быть скомпилировано как *(x + 22)
. По этой причине это может привести к неожиданным результатам приведения двумерного массива к символу *, и недопустимо приведение двумерного массива к символу **.
С учетом этих правил вот как изменит ваш код
void initialize(char (*parent)[20], int *ranks, char *x, int i){
strcpy(parent[i], x);
ranks[i] = '0'; // Did you want an automatic conversion from char to int here? Maybe you meant ranks[i] = 0?
}
int main(){
int n, i = 0; // As Craig mentions, i should start at 0.
char x[20];
printf("Enter how many city are there : "); scanf("%d", &n); fflush(stdin);
char parent[n][20];
int ranks[n];
while(1){
printf("enter city name: "); scanf("%19s", x); // scanf will automatically stop at whitespace, and you must include the max length to avoid a buffer overrun.
if(i < n){
initialize(parent, ranks, x, i);
i++;
} else {
printf("The city is at maximum\n");
// Maybe break here, unless you want an infinite loop
}
}
}