我正在实现具有键/值对数据类型的哈希算法。我将字典存储为数据条目数组。我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);
}
-
从
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);
删除这个
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);
}