-1
votes

L'accès à une gamme de structures donne défaut de segmentation

Je suis en train de mettre en œuvre un algorithme de hachage avec un type de type de paire de clé / valeur. Je stocke le dictionnaire comme une gamme d'entrées de données. I MALLOC CODE> IT, mais quand je vais itérair à travers les éléments que je viens de répartir sur la fonction iniciializar_cerrada code>, programmez segfault à la 2e itération.

Mes partenaires et j'ai essayé Pour comprendre celui-ci, mais le problème a été coincé. P>

SSCCE: P>

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

// ...

#define TAM 11

typedef struct entrada_ {
    int ocupada;
    char clave [LONGITUD_CLAVE];
    char sinonimos [LONGITUD_SINONIMOS];
} entrada;

typedef entrada *tabla_cerrada;

void inicializar_cerrada(tabla_cerrada *diccionario, int tam) {
    int i;
    for (i = 0; i < tam; i++) {
        printf("%d\n", i);
        diccionario[i]->ocupada = 0;
    }
}

int main() {
    tabla_cerrada d = malloc(TAM * sizeof(entrada));    
    inicializar_cerrada(&d, TAM);   
}


9 commentaires

Dans la fonction principale , vous créez un "tableau" de Structure Objects , pas un tableau de pointeurs sur des structures (que la fonction iniciializar_berrada traite comme ).


Ne vous confondez pas par Typef'ing Pointer-Types.


Où est la fonction mostrar_cerrada ? Votre compilateur donne-t-il un avertissement? Diccionario [I] -> Ocupada Cela semble poisson. diccionario est l'adresse d'un pointeur d , pas un tableau.


Si vous savez que segfault à la deuxième itération, vous semblez l'exécuter dans un débogueur. Avez-vous vérifié toutes les variables? Surtout où les pointeurs pointent?


Vous pouvez essayer diccionario [i] -> ocupada => (* diccionario) [i] .Ocupada


Pourquoi Tabla_Cerrada * Diccionario et non Tabla_Cerrada Diccionario ? Parce que tu te confondus? ;-)


@Gerhardh, vous voulez dire (* diccionario) [i] .Ocupada .


@Joeymallone oui je viens de voir ça. ;) Merci


Il serait plus simple d'avoir la fonction prendre d , pas & d


3 Réponses :


0
votes

@gerhardh a commenté : < BlockQuote>

Vous pouvez essayer Diccionario [I] -> Ocupada => (* Diccionario) [i] .Ocupada

Cela a fonctionné super! xxx


1 commentaires

Tant que Void iniciializar_Cerrada (Tabla_Cerrada * Diccionario, int TAM) n'est pas explicitement requis pour ressembler à ceci que vous recherchez des causes et des symptômes bien que correct.



0
votes

Drop this xxx

et juste faire xxx

ou même économiseur: xxx

Si vous êtes obligé d'utiliser xxx

do xxx

toujours tabla_cerrada est Pas une "table" (tableau AKA) mais un pointeur. Comme je l'ai dit, ne vous confondez pas.


3 commentaires

Je ne peux pas laisser tomber cette ligne, sa partie des spécifications du projet.


@Tretorn: Mise à jour de ma réponse.


@alk, vous êtes la bienvenue monsieur, nous sommes les yeux supplémentaires que vous avez besoin de Nitpick. :)



1
votes
  1. Supprimez l'astérisque de la définition de la fonction pour diccionario argument. Tabla_Cerrada est déjà un pointeur:

    void iniciializar_cerrada (Tabla_cerrada diccionario, int ta tam) {

  2. changer la notation de la flèche vers la notation de points. diccionario [i] est un struct , pas un pointeur sur un:

    diccionario [i] .Ocupada = 0;

  3. déposer le & à partir de l'appel de la fonction, d est de type Tabla_cerrada , qui est un pointeur:

    iniciializar_cerrada (d, tam);


0 commentaires