Question

Le code C suivant donne une erreur de segmentation:

#include <stdio.h>
#include <stdint.h>

int main(){
        uint32_t *a;
        uint32_t idx=1233245613;
        a[idx]=1233;
        return 0;
}

Comment utiliser uint32_t comme index d’un tableau en C? Ou comment puis-je utiliser un tableau comme une structure pouvant obtenir uint32_t et des nombres à 12 chiffres sous forme d'indice?

J'apprécierais toute aide.

Était-ce utile?

La solution

  • La variable " a " est juste un pointeur visible.
  • Une variable de pointeur contient l'adresse d'un emplacement de mémoire.
  • Vous devez faire pointer un emplacement de mémoire sur l'espace déjà alloué.

Aussi, vous essayez d’indexer assez loin dans le tableau. Vous n’avez peut-être pas assez de mémoire pour cela, assurez-vous de vérifier NULL.

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

int main(void){

        uint32_t *a;
        uint32_t idx=1233245613;

        //This allows you to index from 0 to 1233245613
        // don't try to index past that number
        a = malloc((idx+1) * sizeof *a);
        if(a == NULL)
        {
           printf("not enough memory");
           return 1;
        }


        a[idx]=1233;
        free(a);
        return 0;
}

Autres conseils

Si vous souhaitez utiliser un " numéro à 12 chiffres " en tant qu'indice, cela signifie que vous avez besoin de plus d'un milliard d'éléments. Chaque élément étant un uint32_t, cela implique qu'il utilise quatre octets de mémoire. Par conséquent, vous avez environ 4 Go de mémoire en tout pour cette baie. Les tableaux ne sont généralement pas aussi grands, pour des raisons de performances ou pour d’autres raisons.

Si vous avez vraiment besoin de chacun de ces milliards d'éléments, examinez les algorithmes sauvegardés sur disque, par exemple Red -Arbres noirs , adaptés à la mise en œuvre de ce type de réseau géant.

Eh bien, pour commencer, vous devez attribuer de l’espace à un.

Lorsque ce code est exécuté, a pointe sur de l'espace en mémoire que vous ne possédez probablement pas.
Lorsque vous essayez d'y accéder (en fait, lorsque vous essayez d'accéder à un + 1233245613), vous accédez à un espace en mémoire dont vous ne possédez absolument pas, ce qui est un non-non et provoquera un crash.

#include <stdio.h>
#include <stdint.h>

int main(){
        uint32_t *a;
        uint32_t idx=1233245613;
        a = malloc(sizeof(unit32_t) * (idx+1));//+1 cause remember, arrays are 0-based
        if(a == NULL) 
        {
           printf("Array could not be allocated"); 
           return 1;
        }
        a[idx]=1233;
        free(a);//good practice to avoid memory leaks
        return 0;
}

Mais même cela ne résout pas le problème que vous utilisez un tableau GIANT. Votre configuration standard (ordinateur de bureau ou même la plupart des serveurs) vous étouffera en essayant d’allouer 4,6 Go de mémoire. Donc, à moins que vous n'ayez pris cela en compte, vous devrez probablement prendre du recul et repenser ce que vous essayez de faire et comment.

Vous avez besoin de deux choses:

  • allouez de la mémoire pour le tableau a , quelque chose comme uint32_t a [2000000000];
  • compilez sur une architecture 64 bits pouvant traiter plus de 4 Go de mémoire.

Whoa. C'est foiré.

OK Deux problèmes ici. Le premier problème est que vous avez déclaré un pointeur sur integer, ne l'avez jamais pointé sur quelque chose, puis essayé de l'utiliser. Ceci est juste à plat un bug. Il est fort probable que le pointeur pointe vers un emplacement qui n'est même pas une mémoire valide pour votre processus (ou NULL). Dans ce cas, toute tentative d'utilisation vous donnera une erreur de segmentation, tout comme vous l'avez obtenue.

Le deuxième problème est la valeur par laquelle vous essayez de l'indexer. Même si vous avez alloué de la mémoire pour votre pointeur, je doute fort que vous auriez pu lui allouer 4,8 gigaoctets. La plupart des ordinateurs ne disposent pas de beaucoup de RAM et ne contiennent pas beaucoup de ressources en un seul bloc contigu. Si vous essayez d’indexer au-delà de la mémoire allouée à un tableau, vous risquez de vous ennuyer, mais si vous passez comme , vous obtiendrez probablement une erreur de segmentation.

a est un pointeur qui pointe vers rien de déterminé. Vous voulez un tableau

uint32_t a[42];

qui crée un tableau de 42 entiers. Cependant, votre accès à celui-ci causera toujours des problèmes (comportement indéfini pour être exact) car il sort des limites de ce tableau ou de tout autre tableau sensible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top