Auteur signifie probablement que les tableaux sont limités dans les moyens qui les font se sentir comme des citoyens de 2ème zone de programmeur point de vue. Par exemple, deux fonctions, l'une est ok, l'autre n'est pas:
int finefunction() {
int ret = 5;
return ret;
}
int[] wtffunction() {
int ret[1] = { 5 };
return ret;
}
Vous pouvez contourner ce un peu en enveloppant les tableaux dans les structures, mais c'est juste souligne que les tableaux sont différents, ils ne sont pas comme les autres types.
struct int1 {
int a[1];
}
int[] finefunction2() {
struct int1 ret = { { 5 } };
return ret;
}
Un autre effet de cette est que vous ne pouvez pas obtenir la taille du tableau au moment de l'exécution:
int my_sizeof(int a[]) {
int size = sizeof(a);
return size;
}
int main() {
int arr[5];
// prints 20 4, not 20 20 as it would if arrays were 1st class things
printf("%d %d\n", sizeof(arr), my_sizeof(arr));
}
Une autre façon de dire ce que les auteurs ont dit que, dans C (et C++) de la terminologie, "array" signifie quelque chose d'autre que dans la plupart des autres langues.
Ainsi, le titre de votre question, comment un "vrai tableau" être stockées dans la mémoire. Eh bien, il n'y a pas une seule sorte de "vrai tableau". Si vous voulais de vrais tableaux en C, vous avez deux options:
-
Utiliser calloc d'allouer de la mémoire tampon, et de stocker le pointeur et le nombre d'éléments ici
struct intarrayref {
size_t count;
int *data;
}
Cette structure est essentiellement référence à un tableau, et vous pouvez les passer bien des fonctions, etc. Vous allez écrire des fonctions d'opérer sur elle, comme créer une copie des données réelles.
-
Utilisation flexible de membre du groupe, et d'allouer de l'ensemble de la structure avec un seul calloc
struct intarrayobject {
size_t count;
int data[];
}
Dans ce cas, vous allouez à la fois les métadonnées (count
), et l'espace de la matrice de données en une seule fois, mais le prix est, vous ne pouvez pas passer cette structure autour de la valeur, pas plus, parce que ce serait de laisser derrière les données supplémentaires. Vous devez passer un pointeur vers cette structure, des fonctions, etc. Donc, il est question d'opinion si l'on considère ceci comme un "vrai tableau" ou juste un peu amélioré normal C tableau.