2012-11-18 8 views
1

je sais que le résultat detableau C malloc() VS {}

int *x = malloc(sizeof(int)*100); 

et

int x[100]; 

est le même, mais le premier est l'allocation de mémoire du segment de mémoire, et la seconde une alloue pile Mémoire.

Maintenant, j'ai besoin de créer un grand tableau (environ 10000 éléments, pas dans un modèle), je pense que malloc() est plus approprié. Mais quand je suis prêt à initialiser le tableau, je suis confronté à un problème. Je ne peux pas utiliser une boucle pour initialiser le tableau, comment puis-je initialiser un tableau créé en utilisant malloc, tout comme l'utilisation

int x[100] = {1,2,3,4,......,6,7,5}; 
+4

Vous ne pouvez pas initialiser en boucle votre tableau dynamique, car ....? – WhozCraig

+0

* Je ne peux pas utiliser de boucle pour initier le tableau * - pourquoi pas? – cdarke

+2

La Règle du pouce StackOverflow # 3 est en vigueur: "Si le PO dit" je sais ", ce n'est pas le cas." –

Répondre

2

Quand vous dites int a[] = { 1, 2, 3 };, vous utilisez un initialiseur pour fournir les données initiales pour (et déduire la taille de) le tableau a. Cela fait partie de la grammaire de C.

Lorsque vous dites int * p = malloc(1000);, vous faites simplement un appel de bibliothèque et vous enregistrez un pointeur. Il n'y a pas de mécanisme dans le langage ou la bibliothèque pour fournir des valeurs initiales pour la mémoire vers laquelle ce pointeur pointe, ni pour que le pointeur pointe vers quoi que ce soit (cela peut être NULL).

Vous devez remarquer que les tableaux ne sont pas des pointeurs et que les pointeurs ne sont pas des tableaux. et p sont des animaux entièrement différents, nonobstant le fait que vous pouvez dire p[1] = a[1];.

+0

Y at-il des cas où un ne peut pas être traité comme b? C'est à l'exception des fonctions comme free() et realloc(), ou il est potentiellement dangereux de passer des pointeurs vers un. – Paul

+0

@Paul: Bien sûr: 'int n; p = & n; 'est valide, mais' a = & n; 'ne l'est pas. La désintégration des tableaux produit des «valeurs» (si cela a du sens). En outre, '& p' a le type' int ** ', tandis que' & a' a le type '(int *) [3]'. –

+0

Cela a du sens. – Paul

0

Si vous ne pouvez pas initialiser la baie avec une boucle, vous pouvez utiliser memset() et vous en sortir.

0

Si les données ne change pas, la meilleure façon est d'écrire

static const int x [100] = { 23, 12, 5, 7, ... }; 

Aucun code. Pas de temps nécessaire pour l'initialisation. J'ai vu du code qui initialisait des mégaoctets de données de cette façon, sans problème.