c语言中的offset_c语言中/和%的区别

c语言中的offset_c语言中/和%的区别今天看libPhenom源代码,看到他们使用的JSON解析库参考的是JanssonJSON解析库。于是就去网上查了这个库,找到了官方网站:http://www.digip.org/jansson/。找了一下发现在Github上能够下载源代码,于是下载了源代码来瞅瞅。    看了一会儿发现有一块代码一直看不明白,就比如说如下的代码:json_t*json_object(void)

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

        今天看libPhenom源代码,看到他们使用的JSON解析库参考的是Jansson JSON解析库。于是就去网上查了这个库,找到了官方网站:http://www.digip.org/jansson/。找了一下发现在Github上能够下载源代码,于是下载了源代码来瞅瞅。

        看了一会儿发现有一块代码一直看不明白,就比如说如下的代码:

json_t *json_object(void)
{
    json_object_t *object = jsonp_malloc(sizeof(json_object_t));
    if(!object)
        return NULL;

    if (!hashtable_seed) {
        /* Autoseed */
        json_object_seed(0);
    }

    json_init(&object->json, JSON_OBJECT);

    if(hashtable_init(&object->hashtable))
    {
        jsonp_free(object);
        return NULL;
    }

    object->serial = 0;
    object->visited = 0;

    return &object->json;
}

        这里在一开始的时候malloc了一块指向struct json_object_t的地址,但是在将指针返回的时候,却并没有将这个分配好内存的指针返回,返回的是内部的一个struct json_t指针。那这样的话,在需要进行回收内存的时候,需要怎么去查找到地址来进行释放呢?

        又看了一会儿突然发现了如下的代码:

#define json_to_object(json_)  container_of(json_, json_object_t, json)

#define container_of(ptr_, type_, member_)  \
    ((type_ *)((char *)ptr_ - offsetof(type_, member_)))

        一下子就明白了,是通过offsetof这个宏来获取到内部成员在结构体内的偏移量,然后进而来获取整个结构体的地址。

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>

struct test {
    int a;
    char b;
    long c;
    char d;
};

struct test2 {
    char a;
    char b;
    char c;
};

struct test3 {
    char a;
    struct test b;
    int c;
};

int main(int argc, const char * argv[]) {
    printf("struct test: offset a %d\n", (int) offsetof(struct test, a));
    printf("struct test: offset b %d\n", (int) offsetof(struct test, b));
    printf("struct test: offset c %d\n", (int) offsetof(struct test, c));
    printf("struct test: offset d %d\n", (int) offsetof(struct test, d));
    
    printf("struct test2: offset a %d\n", (int) offsetof(struct test2, a));
    printf("struct test2: offset b %d\n", (int) offsetof(struct test2, b));
    printf("struct test2: offset c %d\n", (int) offsetof(struct test2, c));
    
    printf("struct test3: offset a %d\n", (int) offsetof(struct test3, a));
    printf("struct test3: offset b %d\n", (int) offsetof(struct test3, b));
    printf("struct test3: offset c %d\n", (int) offsetof(struct test3, c));
    
    struct test3 * item = (struct test3 *) malloc(sizeof(struct test3) / sizeof(char));
    item->a = 'a';
    item->c = 10;
    struct test * innerItem = &item->b;
    innerItem->a = 1;
    innerItem->b = 1;
    innerItem->c = 1;
    innerItem->d = 1;
    
    struct test3 * compareItem = (struct test3 *) ((char *) innerItem - offsetof(struct test3, b));
    
    if (compareItem == item) {
        printf("equal\n");
    } else {
        printf("not equal\n");
    }
    
    free(item);
    
    return 0;
}

         打印结果如下:

struct test: offset a 0
struct test: offset b 4
struct test: offset c 8
struct test: offset d 16
struct test2: offset a 0
struct test2: offset b 1
struct test2: offset c 2
struct test3: offset a 0
struct test3: offset b 8
struct test3: offset c 32
equal
Program ended with exit code: 0

         这里struct test里面成员b和c之间偏移量为4是因为结构体将成员的存放地址对齐了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/172086.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 像Excel一样使用python进行数据分析

    像Excel一样使用python进行数据分析Excel是数据分析中最常用的工具,本篇文章通过python与excel的功能对比介绍如何使用python通过函数式编程完成excel中的数据处理及分析工作。在Python中pandas库用于数据处理

    2022年7月6日
    18
  • pycharm激活码永久[在线序列号]

    pycharm激活码永久[在线序列号],https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    42
  • Razor 组件

    Razor 组件现在已设置好开发环境 接下来将探索 Blazor 项目的结构 并了解如何添加新页 什么是 Razor Razor 是一种标记语法 使用 HTML 和 C 编写 BlazorWeb 应用的 UI 组件 Razor 基于 ASP NET 专为创建 Web 应用而设计 什么是 Razor 组件 Razor 文件定义了构成部分应用 UI 的组件 Blazor 中的组件类似于 ASP NETWebForms 中的用户控件 如果浏览项目 则会看到大部分文件为 razor 文件 在编译时 每个 Razor

    2025年9月30日
    4
  • 使用FileInputStream读取文件内容

    使用FileInputStream读取文件内容废话不多说,直接上关键代码packagecom.zhongjing.file;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;publicclassFileInputStreamDemo{   /**   *FileInputStr…

    2022年6月5日
    27
  • java rsa加解密_Java开发工具

    java rsa加解密_Java开发工具RSA的应用RSA是一种非对称加密算法。现在,很多登陆表单的密码的都采用RSA加密,例如京东中的登陆使用公钥对密码进行加密。Base64编码apache.commons-codex包提供了许多编码格式转换,例如Base64。以下为Base64编码表使用apache.commons-codex进行Base64对字符串进行编码与解码的程序如下:packagecom.qian.encod…

    2022年5月3日
    29
  • linux快捷键(mac版)

    linux快捷键(mac版)控制台快捷键command+a:回到命令开头command+e:回到命令结尾command+u:删除前面所有内容vim快捷键普通模式移动到第一行:gg移动到最后一行:G移动到第几行:数字+G向下移动几行:数字+enter到当前行第几个字符:数字+space查找字符串:/+字符串ZZ显示行号:(:setnu)替换:(:n1,n2/s/word1/word2/gc),$s代表行尾撤销/重做:u/ctrl+rnyy:向下复制多行p:在下一行粘

    2025年5月25日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号