美文网首页
NDK-019: C进阶4: 结构体中的高级话题

NDK-019: C进阶4: 结构体中的高级话题

作者: xqiiitan | 来源:发表于2025-01-06 10:53 被阅读0次

结构体中的高级话题

1.结构体赋值操作

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

typedef struct {
    char name[50];
    int age;
} Student;

void main() {
    Student stu1 = {"Darren", 24};
    Student stu2 ;
    stu2 = stu1; // 赋值的操作。Java中 stu2对象与stu1相等; 
    // C里面 = 相当于内容赋值操作。把stu1的值 一个个赋值给stu2.  strcpy(destStr, souStr)
    printf("%p, %p", &stu1, &stu2); // 打印地址,地址不相等。
    getchar();
}

2.结构体套指针

结构体套指针,必须要对结构体指针进行初始化(赋值);
指针可以指向任何地址,但是他的大小永远是4字节。

typedef struct {
    char* name; // 可以给name任何char*的值,但是结构体大小怎么计算。是个指针。
    int age;
} Student;
void main() {
    Student stu ={"jack", 11};
    stu.name = "Darren"; // 1.将指针的指向常量区中的Darren

    stu.name = malloc(sizeof(char)* 100); // 堆区申请内存
    strcpy(stu.name, "Darren"); //2. 往stu.name 堆区内存里面拷贝数据Darren
    stu.age = 44;
    printf("%s, %d, %d", stu.name, stu.age, sizeof(stu) ); 
}

3.深拷贝和浅拷贝

传入地址可以完成里面对象的赋值,

void copyTo(Student *from, Student *to) {
    *to = *from; // 浅拷贝,指针的赋值运算是一个浅拷贝。把指针的指向指在一起。

    // 指针深拷贝:系统架构的圆形设计模式里面。
    to->name = (char*)malloc(100); 
    strcpy(to->name, from->name); // 开辟内存,进行值的拷贝。
}
void main() {
    Student stu1;
    stu1.mame = malloc(sizeof(char)* 100);
    strcpy(stu.name, "Darren"); 

    Student stu2;
    stu2.name = "jack"; 
    stu2.age = 0;

    copyTo(&stu1, &stu2); // 使用方法拷贝,传入地址
    printf("age, %d, ",stu2.age); 

    //释放内存
    if(stu1.name) {
        free(stu1.name);
        stu1.name=NULL; // 避免野指针
    }
    if(stu2.name) {
        free(stu2.name);
        free(stu2.name); // 释放出错
    }
}

4.结构化的偏移量强化:字节对齐

struct date{ // 12字节 = 4+4+4字节
    int year;
    int month;
    int day;
};
typedef struct student{ // 结构体嵌套。36个字节 =  ????
    int number;// 4
    char sex;// 1字节,但是偏移量是4字节,因为要字节对齐(4的倍数)。
    int age;// 4
    char name[10];// 10,也要字节对齐,所以占12字节。 22/4不能整除。
    struct date birthday;// 12

    // 31%4  32%4  32字节? 还是36个字节 = 24+12
} student ;


void main() {
    student* stu = NULL; // 首地址是0x000000
    int size = sizeof(stu);
    // 内部偏移量: &(stu->number):0, &(stu->sex):4, &(stu->age):8, &(stu->name)12, &(stu->birthday)24 
    printf("student name offset = %d", &(stu->name) );
}

结构体,内部偏移问题:

  1. 怎么获取内部元素的偏移量 &(stu->number) - (int)stu
  2. 获取结构体的大小 sizeof(student)
  3. 大小怎么来的? 根据每个的偏移量计算来的。最终要除模能整除。结构体的大小根数据变量的位置摆放有关。
    字节对齐是针对后面的这个数据来看的。
  4. 把最小的字节数尽量的往后摆放。
    结构体一旦定义了,不要轻易去挪动,因为我们只要知道内部任何一个变量的地址,那么就知道了整个结构体。
    通过+-相关的偏移量,就能拿到其他变量的值。

碰到问题,用心去找问题。

相关文章

  • C语言和OC的结构体(struct)

    Struct(结构体) 1.结构体定义 2.结构体变量 3.结构体数组 4.C语言结构体指针 5.C语言共用体 6...

  • C++系列 --- 结构体、权限修饰符、类简介

    一、结构体 结构体:自定义的数据类型 C++ 中的结构和C中的结构有什么区别? C++中的结构除具备了C中的所有功...

  • C++中结构体

    C++中结构体并不是C中的结构体了 C++的结构体更像是一种特殊的类 他与类一样 可以有public privat...

  • JNI总结

    java调用c/c++ 在C中:JNIEnv 结构体指针别名env二级指针 在C++中:JNIEnv 是一个结构体...

  • 深入理解Runtime中的isa

    objc_object Objective-C 所有对象都是 C 语言结构体objc_object,这个结构体中包...

  • 第九章 类和结构体

    c++中,结构体是稍有不同的类,类能做的,结构体也可以; 而swift中,结构体与类有较大区别, 结构体与类的区别...

  • Log4j2进阶使用(更多高级特性)

    1.高级进阶说明 本文介绍Log4j2高级进阶使用,基于Log4j2进阶使用(按大小时间备份日志),介绍更多的高级...

  • C中的结构体

    C语言的结构体生成以及赋值方法,打点调用,以及->调用 赋值总结:如何取出以及赋值结构体中的成员变量1.结构体变量...

  • 【OC梳理】结构体、枚举

    结构体(struct) OC中的结构体(struct),其实就是C语言中的结构体(struct)常见使用方法。OC...

  • 面经---依依短租

    1. 结构体、共用体、类 C++中结构体与类的区别: 结构体中的成员访问权限不声明时候默认是 public 的,而...

网友评论

      本文标题:NDK-019: C进阶4: 结构体中的高级话题

      本文链接:https://www.haomeiwen.com/subject/kaycyjtx.html