C语言 访问结构数组会导致分段错误



我正在实现具有键/值对数据类型的哈希算法。我将字典存储为数据条目数组。我malloc它,但是当我遍历刚刚在inicializar_cerrada函数上分配的元素时,在第二次迭代时程序段错误。

我和我的合作伙伴一直在试图解决这个问题,但问题一直存在。

SSCCE:

#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("%dn", i);
        diccionario[i]->ocupada = 0;
    }
}
int main() {
    tabla_cerrada d = malloc(TAM * sizeof(entrada));    
    inicializar_cerrada(&d, TAM);   
}
  1. diccionario参数的函数定义中删除星号。 tabla_cerrada已经是一个指针:

    void inicializar_cerrada(tabla_cerrada diccionario, int tam) {

  2. 将箭头表示法更改为点表示法。 diccionario[i]是一个struct,而不是指向一个的指针:

    diccionario[i].ocupada = 0;

  3. 从函数调用中删除&d的类型为 tabla_cerrada ,这是一个指针:

    inicializar_cerrada(d, TAM);

删除这个

typedef entrada *tabla_cerrada;

然后就做

void inicializar_cerrada(entrada *diccionario, int tam) {
    int i;
    for (i = 0; i < tam; i++) {
        printf("%dn", i);
        diccionario[i].ocupada = 0;
    }
}
int main(void) {
    entrada * d = malloc(TAM * sizeof(entrada));    
    inicializar_cerrada(d, TAM);    
}

甚至节省:

void inicializar_cerrada(entrada *diccionario, size_t tam) {
    for (size_t i = 0; i < tam; ++i) {
        printf("%zun", i);
        diccionario[i].ocupada = 0;
    }
}
int main(void) {
    entrada * d = malloc(TAM * sizeof *d);  
    inicializar_cerrada(d, TAM);    
}

如果您被迫使用

typedef entrada *tabla_cerrada;

void inicializar_cerrada(tabla_cerrada diccionario, size_t tam) {
    for (size_t i = 0; i < tam; ++i) {
        printf("%zun", i);
        diccionario[i].ocupada = 0;
    }
}
int main(void) {
    tabla_cerrada d = malloc(TAM * sizeof *d);  
    inicializar_cerrada(d, TAM);    
}

仍然tabla_cerrada不是"表"(又名数组),而是一个指针。正如我所说,不要混淆自己。

@Gerhardh评论道:

你可以试试diccionario[i]->ocupada => (*diccionario)[i].ocupada

效果很好!

#include <stdio.h>
#include <stdlib.h>
#define LONGITUD_CLAVE 30
#define LONGITUD_SINONIMOS 300
#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("%dn", i);
        (*diccionario)[i].ocupada = 0;
    }
}
int main() {
    tabla_cerrada d = malloc(TAM * sizeof(entrada));    
    inicializar_cerrada(&d, TAM);   
}

相关内容

  • 没有找到相关文章