如何解决无法获得阵列指针的正确长度
也许这真的很愚蠢,但我找不到解决方法。
typedef struct Node{
char *val;
struct Node *next;
}Node;
int main(){
Node *table; // hashtable
int n,i,j,choice,search;
//int hash_num,val;
char doc_name1[8] = "docA.txt";
char doc_name2[8] = "docB.txt";
char doc_name3[8] = "docC.txt";
char doc_name4[8] = "docD.txt";
// allocate table
table = (Node*) malloc(N*sizeof(Node)); //Iniciando la table con N = 30 posiciones
//make table "heads" NULL
for(i = 0; i < N; i++){
table[i].next = NULL;
}
printf("--h(x) = xmod%d--\n",N);
printf("\n\n");
while(1){
printf("1.Insertar registros\n");
printf("2.Delete a number\n");
printf("3.Search a number\n");
printf("4.Show Hash Table\n");
printf("0.Exit Programm\n");
printf("\n--------\n");
printf("Choice: ");
scanf("%d",&choice);
switch(choice){
case 0: return;
case 1:
table = insert(table,doc_name1);
//table = insert(table,doc_name2);
//table = insert(table,doc_name3);
//table = insert(table,doc_name4);
break;
case 2:
// delete a number
printf("Give a number: ");
scanf("%d",&search);
table = del(table,N,search);
printf("\n--------\n");
break;
case 3:
// search for a number
printf("Give a number: ");
scanf("%d",&search);
search_table(table,search);
printf("\n--------\n");
break;
case 4:
//print hashtable
printf("-HASHTABLE-\n\n");
print_table(table,N);
printf("\n--------\n");
break;
}
}
return 0;
}
Node *insert(Node *table,char *val){
Node *nn,*cur;
int lenght = strlen(val);
int hash_index = H(val);
nn = (Node*)malloc(sizeof(Node)); //Memoria para el nuevo nodo
nn->val = malloc((lenght+1)*sizeof(char));
strncpy(nn->val,val,lenght); //Valor del nuevo nodo va a ser lo que pasamos
nn->next = NULL; //Siguiente apunta a null
if(table[hash_index].next == NULL){ //Si donde apunta el indice a insertar no hay nada
table[hash_index].next = nn; //Insertamos ahí el nodo
return table; //Devolvemos la tabla
}
//Si no
cur = table[hash_index].next; //cur recibe el siguiente
while(cur->next != NULL){ //mientras que siga habiendo siguiente
cur=cur->next; //seguimos avanzando
}
cur->next = nn; //Inserta al final de la lista enlazada
return table; //Devuelve la tabla
}
这不是完整的代码,但我认为这是显示我的问题所必需的。
问题是(使用 CodeBlocks 调试器)我可以看到插入函数中的变量 lenght 如何在初始执行点初始化为值 8。但是当函数被调用并且对 doc_name 的引用被传递时,它变成了 11。 写这行时,我注意到它只显示了 8 次,现在总是 11。
我可以看到这与参数 val 传递的字符数比声明的多一些,但我该如何解决?
解决方法
这些字符数组
char doc_name1[8] = "docA.txt";
char doc_name2[8] = "docB.txt";
char doc_name3[8] = "docC.txt";
char doc_name4[8] = "docD.txt";
不包含字符串,因为它们没有足够的空间来容纳用作初始化器的字符串文字的零终止字符 '\0'
。
因此使用函数 strlen
和这些数组就像在这个声明中
int lenght = strlen(val);
调用未定义的行为。
改为写
char doc_name1[] = "docA.txt";
char doc_name2[] = "docB.txt";
char doc_name3[] = "docC.txt";
char doc_name4[] = "docD.txt";
字符串的另一个问题是在这些语句中
nn->val = malloc((lenght+1)*sizeof(char));
strncpy(nn->val,val,lenght);
再次不复制零终止字符 '\0'
。你需要写
nn->val = malloc((lenght+1)*sizeof(char));
strcpy( nn->val,val );
至少函数 insert
的第二个参数应该有限定符 const
Node *insert(Node *table,const char *val);
因为传递的字符串在函数内没有改变。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。