热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C-一行代码正在改变结构的地址

如何解决《C-一行代码正在改变结构的地址》经验,为你挑选了1个好方法。

我的代码中发生了一个重大问题,我现在一直试图修复几个小时.

下面的代码是与我所遇到的问题相关的代码......

方法addBucket:

void addBucket(SPACE * hashmap,char * tempvalue, char * tempkey){
    printf("BEGINNING OF FUNC...\n");

    void *prevadd = hashmap[0];
    char *value = varString(tempvalue);
    char *key = varString(tempkey);
    void *aftadd = hashmap[0];

    printf("BUCKET %s - %s\n",value,key);

    BUCKET *newBucket = malloc(sizeof(BUCKET *));
    fillBucket(value,key,newBucket);
    int hash = hashFunc(key);

    printf("FILL, FULFILLED\n");

    if(!hashmap[hash]){
        hashmap[hash] = malloc(sizeof(BASE*));
        hashmap[hash]->first = NULL;
    }

    ITEM *location;
    location = hashmap[hash]->first;

    //This creates a new item in the list, if there isn't any.
    //It does this by initialising the base, called box.
    if(!location){
        hashmap[hash]->first = (ITEM *) calloc(1,sizeof(ITEM *));
        hashmap[hash]->first->next = NULL;
        hashmap[hash]->first->prev = NULL;
        hashmap[hash]->first->data = newBucket;
    }

        //This instead adds a new item to the list.
    else{
        //This loop reaches the last ITEM in the linked list itself
        while(location->next){
            location = location->next;
        }

        //This initialises the newItem that will be added
        ITEM *newItem = (ITEM *) calloc(1,sizeof(ITEM));
        newItem->next = NULL;
        newItem->data = newBucket;
        newItem->prev = location;
        location->next = newItem;
    }
}

使用的声明结构:

//Declares a struct called BUCKET.
//Serves as the bucket of the hash table.
typedef struct bucket{
    char * value; //The value inputted.
    char * key; //The key to be hashed.
}BUCKET;

//Declares a struct called ITEM.
//Holds the bucket, as well as the address to the next bucket.
//It also holds the address to the previous bucket.
typedef struct item{
    struct bucket * data;
    struct item * next;
    struct item * prev;
}ITEM;


//Declares a struct called BASE.
//Serves as the base node for the linked lists.
//The amount of initialised linked lists is the same as the amount of bases.
typedef struct base{
    struct item * first;
}BASE;

//Declares a struct of an array of BASES, meaning linked lists.
//Essentially defines the size of the hashspace.
typedef BASE *SPACE;

...而方法expandHashspace(); :

//Makes the size of the entire hashspace larger.
//Only takes a value larger than the current size due to possible data loss.
SPACE* expandHashspace(SPACE *hashmap, int newSize){
    if(newSize>100 || newSize

这里也是initHashmap()方法:

SPACE* hashmapInit(SPACE *hashmap){
    hashmap = calloc(5, sizeof(SPACE *));
    hashSpaceSize = 5;
    return hashmap;
}

我在这里做的是初始化hashmap,添加三个桶,扩展hashmap,然后再添加三个桶.这是更简单的顺序:

initHashmap();
addBucket(...); x3
expandHashmap();
addBucket(...); x3

但是,在最后一部分,只要我运行一次addBucket,就会出现SIGSEGV错误.通过调试检查,我发现了一些关闭的东西.

你看到的变量*prevadd*aftadd?我在调试时添加了它们,以查看hashmap [0]的地址发生了什么.这是我的结果图:

你能看到问题吗?

正如你在那里看到的那样,hashmap [0]的地址在这两char *行中变化很大.具体来说,地址的变化发生char *value在线上.

请放轻松我,因为我刚刚开始学习C 3个月前,我仍然非常不习惯内存分配.如果错误是显而易见的,请指出它,如果我分配内存或释放它的方式有问题,我很高兴听到它们(我的代码有一个非常重要的heisenbug,我无法解决对于我的生活,但这不是重点).

提前谢谢...抱歉所有最近的问题.

更新:忘了添加varString(); ...

char* varString(const char *origString){
    size_t i;
    for(i = 0;origString[(int)i]!='\0';i++){}
    if(origString[i-1]=='\n') i-=2;
    char *newString = malloc(i);
    for(int j = 0; j <= i; j++){
        newString[j] = origString[j];
    }
    newString[i+1] = '\0';
    return newString;
}

lockcmpxchg8.. 5

这不是一个答案,但它需要比评论中更多的格式:

请注意,您正在写作 "Value No. 1"

注意值aftadd0x756c6156

在内存中,假设一个小端机器,数字的布局aftadd将是:

0x56 0x61 0x6c 0x75

在ASCII中,这些将是:

'V' 'a' 'l' 'u'

提示提示.



1> lockcmpxchg8..:

这不是一个答案,但它需要比评论中更多的格式:

请注意,您正在写作 "Value No. 1"

注意值aftadd0x756c6156

在内存中,假设一个小端机器,数字的布局aftadd将是:

0x56 0x61 0x6c 0x75

在ASCII中,这些将是:

'V' 'a' 'l' 'u'

提示提示.


推荐阅读
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • MySQL初级篇——字符串、日期时间、流程控制函数的相关应用
    文章目录:1.字符串函数2.日期时间函数2.1获取日期时间2.2日期与时间戳的转换2.3获取年月日、时分秒、星期数、天数等函数2.4时间和秒钟的转换2. ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • 深入解析CAS机制:全面替代传统锁的底层原理与应用
    本文深入探讨了CAS(Compare-and-Swap)机制,分析了其作为传统锁的替代方案在并发控制中的优势与原理。CAS通过原子操作确保数据的一致性,避免了传统锁带来的性能瓶颈和死锁问题。文章详细解析了CAS的工作机制,并结合实际应用场景,展示了其在高并发环境下的高效性和可靠性。 ... [详细]
  • 本文详细介绍了 com.apollographql.apollo.api.internal.Optional 类中的 orNull() 方法,并提供了多个实际代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • This feature automatically validates new regions using the AWS SDK, ensuring compatibility and accuracy. ... [详细]
  • 我在使用 AngularJS 的路由功能开发单页应用 (SPA),但需要支持 IE7(包括 IE8 的 IE7 兼容模式)。我希望浏览器的历史记录功能能够正常工作,即使需要使用 jQuery 插件。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • ARM汇编基础基于Keil创建STM32汇编程序的编写
    文章目录一、新建项目(1)工具介绍(2)创建项目:二、配置环境(1)配置芯片&#x ... [详细]
  • 在JUnit测试框架中,确保@Test注解的方法按特定顺序执行是常见的需求。本文总结了三种实现这一目标的策略。首先,介绍了通过方法名称排序来控制执行顺序的基本方法。其次,推荐了一种利用依赖管理插件的方式,这种方法更为灵活且易于维护。最后,探讨了使用第三方库如TestNG或Jupiter扩展来实现更复杂的顺序控制。每种方法都有其适用场景和优缺点,开发者可以根据具体需求选择最合适的方案。 ... [详细]
  • 本文深入解析了JDK 8中HashMap的源代码,重点探讨了put方法的工作机制及其内部参数的设定原理。HashMap允许键和值为null,但键为null的情况只能出现一次,因为null键在内部通过索引0进行存储。文章详细分析了capacity(容量)、size(大小)、loadFactor(加载因子)以及红黑树转换阈值的设定原则,帮助读者更好地理解HashMap的高效实现和性能优化策略。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
author-avatar
qyfdxlwb
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有