2017-08-20 4 views
-1

Si je crée un tableau de taille 10 et que seulement 2 éléments sont stockés dans le tableau, les espaces restants seront gaspillés. alors comment puis-je résoudre ce problème? (par structure de données)Comment puis-je économiser de l'espace dans un tableau qui n'est pas utilisé?

+7

Création d'un réseau de s ize 2? Serait-ce une option? – Daniele

+3

Si le tableau a été alloué dynamiquement, vous pouvez simplement utiliser realloc(). – Frank

+0

@ Daniele oui mais il n'y a aucun moyen que je puisse éviter cela en utilisant la structure de données? –

Répondre

2

Vous utiliseriez une simple liste liée au lieu d'un tableau, ou si vous devez utiliser un tableau, vous devez utiliser realloc(), qui rétrécir le tableau à utiliser seulement deux cellules, au lieu de 10. , comme ceci:

#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    int* ptr = malloc(10 * sizeof(int)); 
    ptr[0] = 4; 
    ptr[1] = 13; 
    ptr = realloc(ptr, 2 * sizeof(int)); 
    printf("%d %d\n", ptr[0], ptr[1]); 
    return 0; 
} 

sortie:

+1

Merci qui a résolu le problème –

+0

@NachiketMore puis * accepter * ma réponse s'il vous plaît. Vous faites cela en cliquant sur la coche sur la gauche de mon message. – gsamaras

1

Dans la plupart des cas, vous utiliseriez l'allocation de mémoire dynamique. Cela signifie appeler malloc pour acquérir une quantité initiale de mémoire, suivi de realloc si nécessaire lorsque l'espace est insuffisant, et free à la fin, pour renvoyer la mémoire à l'arène. Voici une fonction qui lit une ligne de l'entrée standard. Renvoie la mémoire allouée dynamiquement

#define INITALLOC 16 /* #chars initally alloced */ 
#define ALLOCSTEP 8 /* #chars to realloc by */ 
int getline(char **dynline) 
{ 
    int i, c; 
    size_t nalloced; /* #chars currently alloced */ 

    if ((*dynline = malloc(INITALLOC)) == NULL) 
     return -1; /* return -1 on mem. err */ 
    nalloced = INITALLOC; 
    for (i = 0; (c = getchar()) != EOF; ++i) { 
     /* buffer is full; request more mem */ 
     if (i == nalloced) 
      if ((*dynline = realloc(*dynline, nalloced += STEP)) == NULL) 
       return 0; 
     /* store the newly read character */ 
     (*dynline)[i] = c; 
    } 
    /* zero terminate the string */ 
    (*dynline)[i] = '\0'; 

    if (c == EOF) 
     return 0; /* return 0 on EOF */ 

    return 1; 
} 

L'utilisateur de cette fonction est responsable de la libération de la mémoire. Ex:

char *buf; 
printf("What is your full name?\n"); 
if (getline(&buf) > 0) 
    puts(buf); 
free(buf); 

Bien sûr, il y a encore du gaspillage, mais cela est impossible à résoudre en utilisant un réseau. Considérons une liste chaînée https://www.cs.cmu.edu/~adamchik/15-121/lectures/Linked%20Lists/linked%20lists.html