【问题标题】:Cannot get correct lenght of an array pionter无法获得正确的数组指针长度
【发布时间】:2021-09-12 02:10:10
【问题描述】:

也许这真的很愚蠢,但我找不到解决它的方法。

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, N, 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"; 是错误的,因为 C 中的字符串需要 NUL 终止。所以需要 9 个字节的数组来存储 8 个字符的字符串。试试char doc_name1[] = "docA.txt";,它允许编译器计算出所需数组的大小。
  • @kaylum,因为doc_nameX 从未被修改过,所以它们不需要是"docX.txt" 的副本。一个指针就足够了:char *doc_nameX = "docX.txt";。甚至更好:const char *doc_nameX = "docX.txt";

标签: c hashtable singly-linked-list c-strings strlen


【解决方案1】:

这些字符数组

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);

因为传递的字符串在函数内没有改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    相关资源
    最近更新 更多