Reputation: 93
I want to declare an array of pointers to array of pointers to char and initialize it. But i couldn't declare and initialize it using the following way:
char *(*array[])[] = {
{ "car", "toy", "game" },
{ "go", "play", "read" }
};
Please write the correct form of my declaration and initialization? I get warning messages like "warning: brace around scalar initializer" and also "note: (near initialization for 'array[0]' )"
Upvotes: 1
Views: 155
Reputation: 144550
Before C99, you had to define the inner arrays separately:
#include <stdio.h>
int main() {
const char *array_0[] = { "car", "toy", "game" };
const char *array_1[] = { "go", "play", "read" };
const char **array[] = { array_0, array_1 };
int i, j;
for (i = 0; i < 2; i++) {
for (j = 0; j < 3; j++) {
printf("%s ", array[i][j]);
}
printf("\n");
}
return 0;
}
With C99, you can now define and initialize the same object directly:
#include <stdio.h>
int main() {
const char **array[] = {
(const char *[]){ "car", "toy", "game" },
(const char *[]){ "go", "play", "read" },
};
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 3; j++) {
printf("%s ", array[i][j]);
}
printf("\n");
}
return 0;
}
Of course this is more flexible than a 2D matrix: each inner array can have a different size, as in:
#include <stdio.h>
int main() {
const char **array[] = {
(const char *[]){ "car", "toy", "game", NULL },
(const char *[]){ "go", "play", NULL },
(const char *[]){ "read", NULL },
NULL,
};
for (int i = 0; array[i]; i++) {
for (int j = 0; array[i][j]; j++) {
printf("%s ", array[i][j]);
}
printf("\n");
}
return 0;
}
Output:
car toy game go play read
Note that I added the const
keyword because string literals should not be modified, so pointers to them should be defined as const char *
.
Upvotes: 1
Reputation: 60056
char *(*array[])[] = {
&(char*[]){"car","toy","game" },
&(char*[]){"go","play","read" }
};
compiles without a warning.
It's not nested arrays, it's an array of pointers (&
) to arrays of char*
(char*[]`) so I don't think you can do without either compound literals or separate array objects to make array pointers out of.
(Don't forget that assigning to char*
from string literals is kind of a bad practice as string literals are practically, though not formallychar const[]
, so using
char const*instead of
char *` would be preferable.)
Upvotes: 0