我正在实现具有键/值对数据类型的哈希算法。我将字典存储为数据条目的数组。我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("%d\n", i);
diccionario[i]->ocupada = 0;
}
}
int main() {
tabla_cerrada d = malloc(TAM * sizeof(entrada));
inicializar_cerrada(&d, TAM);
}
答案 0 :(得分:1)
从diccionario
参数的函数定义中删除星号。 tabla_cerrada
已经是一个指针:
void inicializar_cerrada(tabla_cerrada diccionario, int tam) {
将箭头符号更改为点符号。 diccionario[i]
是struct
,而不是指向一个的指针:
diccionario[i].ocupada = 0;
从函数调用中删除&
,d
的类型为tabla_cerrada
,它是一个指针:
inicializar_cerrada(d, TAM);
答案 1 :(得分:0)
您可以尝试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("%d\n", i);
(*diccionario)[i].ocupada = 0;
}
}
int main() {
tabla_cerrada d = malloc(TAM * sizeof(entrada));
inicializar_cerrada(&d, TAM);
}
答案 2 :(得分:0)
丢弃此
typedef entrada *tabla_cerrada;
然后做
void inicializar_cerrada(entrada *diccionario, int tam) {
int i;
for (i = 0; i < tam; i++) {
printf("%d\n", 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("%zu\n", 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("%zu\n", i);
diccionario[i].ocupada = 0;
}
}
int main(void) {
tabla_cerrada d = malloc(TAM * sizeof *d);
inicializar_cerrada(d, TAM);
}
仍然tabla_cerrada
不是“表”(也称为数组),而是指针。如我所说,不要混淆自己。