无法获得阵列指针的正确长度

如何解决无法获得阵列指针的正确长度

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

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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-