8
votes

Pouvez-vous définir la taille d'un tableau au moment de l'exécution en C

Nouveau à C, merci beaucoup d'aide.

est-il possible de définir un tableau en C sans spécifier sa taille ni l'initialisation.

Par exemple, puis-je inviter un utilisateur à entrer des numéros et à les stocker dans un tableau INT? Je ne saurai pas combien de chiffres ils entreront à l'avance.

La seule façon dont je peux penser maintenant est de définir une taille maximale, ce qui n'est pas une solution idéale ...


0 commentaires

10 Réponses :


15
votes

Eh bien, vous pouvez allouer de manière dynamique la taille:

#include <stdio.h>

int main(int argc, char *argv[])
{
  int *array;
  int cnt;
  int i;

  /* In the real world, you should do a lot more error checking than this */
  printf("enter the amount\n");
  scanf("%d", &cnt);

  array = malloc(cnt * sizeof(int));

  /* do stuff with it */
  for(i=0; i < cnt; i++)
    array[i] = 10*i;

  for(i=0; i < cnt; i++)
    printf("array[%d] = %d\n", i, array[i]);

  free(array);

  return 0;
}


5 commentaires

Certes, vous devez connaître Hoy de nombreux chiffres que vous ajoutez à chaque course. realloc sinon.


Merci pour l'aide. Je suppose que je n'ai pas clairement posé la question dans mon premier post. Le problème est que nous ne savons pas combien de numéros l'utilisateur entrera et l'utilisateur ne sais pas non plus. Disons que nous demandons à l'utilisateur de saisir un nombre de chiffres et nous calculons la moyenne pour lui. Tout ce qu'il doit faire, c'est le numéro de type, appuyez sur Entrée, tapez un autre numéro ... et tapez Q quand il est fait. Comment puis-je contenir ces chiffres dans un tableau sans demander à l'utilisateur de me dire combien de chiffres il envisage de taper? Ce sera une simple utilisation vectorielle en C ++ ...


Désolé, la moyenne est un mauvais exemple, car tout ce dont nous avons besoin est une somme, disons que nous devons tenir tous les chiffres pour faire un calcul de fantaisie ...


@Bobby - parlant de fautes de frappe, "dynamiquement" n'a pas de "O". Mais ce n'est pas un problème grave.


En C ++, la classe "Vector" réaffiche de manière dynamique votre mémoire lorsqu'elle grandit au-delà de la taille. En C, il n'y a pas de mécanisme intégré pour le faire; Vous devez soit la mettre en œuvre vous-même (à l'aide de RealLoc) ou utiliser une bibliothèque tierce qui implémente des vecteurs ou des listes liées à C.



3
votes

Les tableaux, par définition, sont des structures de mémoire de taille fixe. Vous voulez un vecteur. Puisque Standard C ne définit pas les vecteurs, vous pouvez essayer de rechercher une bibliothèque ou de rouler à la main.

Vous devez effectuer une allocation dynamique: vous voulez un pointeur à une adresse mémoire de la taille encore inconnue. Lisez sur MALLOC et realloc .


2 commentaires

De plus, juste pour ajouter à cela, une méthode populaire de réalloc () est que chaque fois que vous n'aurez besoin de realloc (parce que vous avez manqué de chambre), double la taille de la matrice; De cette façon, vous faites comme peu d'appels réelococ.


Doubler la taille de chaque réaffectation ne consiste pas à minimiser le nombre de realloc , en soi, mais sur le maintien d'une bonne efficacité asymptotique. Si vous ajoutez une augmentation constante au vecteur à chaque réallocation, appuyez sur N Eléments prend O (n ^ 2) heure. Si vous multipliez la taille par un facteur 1 1 chacun à la réaffectation, chaque poussée prend une durée constante amortie et tout le processus prend O (n) temps.



6
votes

Peut-être quelque chose comme ceci: xxx

Cela demandera aux chiffres et les stockera dans une matrice, comme vous l'avez demandé. Il sera terminé lors de la transmission d'un 0.

Vous créez une fonction d'accesseur array_push pour ajouter à votre tableau, appelez realloc à partir de cette fonction lorsque vous manquez d'espace. Vous doublez la quantité d'espace alloué à chaque fois. Au plus, vous allouerez au maximum le double de la mémoire dont vous avez besoin, au pire, vous appellerez realloc journal N fois, où est N est la taille de la matrice finale prévue.

Vous pouvez également vouloir Vérifiez la défaillance après avoir appelé Malloc et Realloc. Je n'ai pas fait ceci ci-dessus.


2 commentaires

Dans un autre commentaire, vous avez mentionné que vous vouliez que le programme cesse de demander des chiffres lorsque l'utilisateur fournit un «Q». Faites cela en appelant Scanf avec% s au lieu de% d. Ensuite, vous comparez le personnage à 'Q' et décidez de cesser de fumer ou non. Ensuite, vous devez le convertir en Int en appelant AOI


Merci beaucoup, c'est intelligent et m'a montré une façon différente de penser à ce problème: ne doit pas nécessairement être exacte, approximative d'abord puis développer plus tard. Je vais probablement examiner la manière dont le vecteur est mis en œuvre en C ++, que je pense offrira des idées dans ce type de problème.



0
votes

Vous pouvez utiliser masloc pour allouer la mémoire de manière dynamique (c'est-à-dire que la taille n'est pas connue tant que l'exécution).

C est une langue de bas niveau: vous devez libérer manuellement la mémoire après sa utilisation; Si vous ne le faites pas, votre programme souffrira de fuites de mémoire.

Mise à jour

Il suffit de lire votre commentaire sur une autre réponse.

Vous demandez une matrice avec une taille de changement de manière dynamique.

Eh bien, c n'a pas de logements / installations syntaxiques pour le faire; Vous devez soit implémenter cela vous-même ou utiliser une bibliothèque qui l'a déjà mise en œuvre.

Voir cette question: Existe-t-il une mise en œuvre de la matrice de redimensionnement automatique / dynamique pour C qui est livré avec GLIBC?


0 commentaires

0
votes

Pour quelque chose comme ça, vous voudrez peut-être examiner les structures de données telles que: Listes liées (idéales pour cette situation) Divers arbres (arbres binaires, tas, etc.) Stacks & files d'attente

Mais pour instantifier un tableau de tailles variable, ce n'est pas vraiment possible.

Le plus proche d'un tableau dynamique consiste à utiliser MALLOC et ses commandes associées (Supprimer, Realloc, etc.).

Mais dans cette situation, l'utilisation de commandes telles que MALLOC peut entraîner la nécessité d'élargir la matrice, une opération coûteuse où vous initialisez un autre tableau, puis copiez l'ancien tableau dans cela. Les listes et d'autres types de données sont généralement beaucoup mieux à redimensionnement.


0 commentaires

0
votes

Si vous recherchez des installations de réseau et que vous ne voulez pas rouler le vôtre, essayez ce qui suit:

  1. Glib
  2. Apache APR
  3. NSPR

0 commentaires

2
votes

Si tout ce dont vous avez besoin est une structure de données où, dans vous, vous pouvez modifier sa taille de manière dynamique, la meilleure option que vous pouvez utiliser est une liste liée. Vous pouvez ajouter des données à la liste allouée de manière dynamique de la mémoire et cela serait beaucoup plus facile !!


1 commentaires

+1, une simple liste liée ressemble à la meilleure option compte tenu des informations de la question. Si OP pouvait clarifier ce qu'il va faire avec l'information après la lecture, nous pourrons peut-être suggérer une structure de données encore plus appropriée.



0
votes

Si vous êtes un débutant, vous ne voulez peut-être pas traiter avec masloc code> et gratuit code>. Donc, si vous utilisez GCC, vous pouvez attribuer des tableaux de taille variable sur la pile, spécifiant la taille comme une expression.

Par exemple: P>

#include <stdio.h>
void dyn_array(const unsigned int n) {
        int array[n];
        int i;

        for(i=0; i<n;i++) {
                array[i]=i*i;
        }
        for(i=0; i<n;i++) {
                printf("%d\n",array[i]);
        }
}
int main(int argc, char **argv) {
        dyn_array(argc);
        return 0;
}


1 commentaires

Ce n'est pas une "expression non standard" - au moment où la réponse avait été écrite, c'était la norme internationale depuis 10 ans. Le problème sont les nombreux compilateurs véritablement non standard de telles entreprises incompétentes telles que Microsoft qui ne soutiennent même pas de normes de 10 ans.



2
votes

Oui, absolument. C99 a introduit le tableau VLA ou de longueur variable. Un seul code simple serait comme tel: xxx


1 commentaires

Bloc de code: = indent avec quatre espaces. Un raccourci est: Bloc de surbrillance et appuyez sur Ctrl-K. Hth.



0
votes

ci-dessus Les réponses ci-dessus sont correctes mais il y a une correction, la fonction MALLOC () réserve un bloc de mémoire de taille spécifiée et renvoyer un pointeur de type vidien * qui peut être lancé dans un pointeur de n'importe quelle forme. Syntaxe: PTR = (Type de Cast *) MALLOC (Taille d'octets) FORT>

#include<stdio.h>
#include<cstdlib>
int main(int argc,char* argv[]){
int *arraySize,length;
scanf("%d",&length);
arraySize = (int*)malloc(length*sizeof(int));
for(int i=0;i<length;i++)
    arraySize[i] = i*2;
for(int i=0;i<length;i++)
    printf("arrayAt[%d]=%d\n",i,arraySize[i]);
free(arraySize);
}


0 commentaires