首页 > 其他分享 >c——动态数组

c——动态数组

时间:2022-11-17 13:22:34浏览次数:48  
标签:arr int char 数组 printf test 动态 buf

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

typedef struct test_s test_t;

struct test_s {
    int a;
    int b;
    char arr[0];
};

int main()
{
    test_t *t;
    char buf[32] = {0};
    int i;

    t = (test_t *)buf;
    t->a = 1;
    t->b = 2;
    memcpy(t->arr, "123", 3);

    printf("%d, %d, %s\n", sizeof(test_t), t->a, t->arr);

    for (i = 0; i < sizeof(buf); i++) {
        printf("%x ", buf[i]);
    }
    printf("\n");

    return 0;
}

运行结果
8, 1, 123
1 0 0 0 2 0 0 0 31 32 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
如果做下调整

struct test_s {
    int a;
    char arr[0];
    int b;
};

则会导致覆盖
1 0 0 0 31 32 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
说明 char arr[0],没有静态分配内存,只是定义一个符号给编译器用,符号表示的地址为 char arr[0] 前声明的分配了内存的空间的偏移。

这样的好处:避免指针的复杂操作,比如上面代码用指针只能:

typedef struct test_s test_t;

struct test_s {
    int a;
    int b;
    char *arr;
};

int main()
{
    test_t *t;
    char buf[32] = {0};
    int i;

    t = (test_t *)buf;
    t->a = 1;
    t->b = 2;
    t->arr = (char *)t + sizeof(*t);
    memcpy(t->arr, "123", 3);

    printf("%d, %d, %s\n", sizeof(test_t), t->a, t->arr);

    for (i = 0; i < sizeof(buf); i++) {
        printf("%x ", buf[i]);
    }
    printf("\n");

    return 0;
}

运行结果

12, 1, 123
1 0 0 0 2 0 0 0 ffffffa8 69 ffffffcb ffffffbf 31 32 33 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

标签:arr,int,char,数组,printf,test,动态,buf
From: https://www.cnblogs.com/yangxinrui/p/16899172.html

相关文章

  • 两个数组的交集II
    两个数组的交集一、题目描述给定两个数组nums1和nums2,求出给相交的元素的即可。返回的结果元素,应与两个数组中元素出现的次数相同,如果不相同,则返回较小的次数。实例1:......
  • 数组转化为字符串
    这是初始值:data(){ tap:[ {taps:''} ]}; tapCode:''要将tap中的数据转化为字符串储存在tapCode中: this.tapCode="";//要确保字符串为空for(leti=0;......
  • Java中一维数组和二维数组的详解
    博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,......
  • 数组和字符串
    数组和字符串转换字符串转数组constStr="1,2,3,3,"consrArr=Str.split(',')//","指的是字符串的分隔点console.log(Arr);//Arr=[1,2,3,3]数组转字符串cons......
  • QVector初始化二维数组大小
    初始化1维数组的大小QVector<double>array(10);//10个元素,每个都初始化为0初始化2维数组的大小QVector<QVector<double>>array2D(6,QVector<double>(10));//6个元......
  • Java 数组与ArrayList的互转
    数组转List数组转其他,都要借助​​Arrays​​工具类:如果是引用类型数组,则可以直接用​​Arrays.asList​​;如果是基本类型数组,则要先转为​​Arrays.stream​​:引用类型数......
  • C# 使用SIMD向量类型加速浮点数组求和运算(3):循环展开
    作者:zyl910目录一、背景1.1循环展开简介1.2测试准备二、在C#中使用2.1对基础算法做循环展开2.1.1测试结果:2.2对Vector4版算法做循环展开2.2.1测试结果:2.3对V......
  • c++定义二维数组
     vector<vector<int>>vec;        //定义行列未知的二维数组vector<vector<int>>array(5);     //定义行为5的二维数组vector<vector<......
  • 数组模拟各类数据结构
    数组模拟各类数据结构 Hash(散列)  并查集   Trie树 堆映射版本堆,Dijkstra需要用到 堆排序  链表  栈与队列......
  • 数组指针强制转换为结构体指针
    前两天在看TI官方提供的BasicRF的源码时,发现一个看不懂的地方,就是将一个数组名强制转换为结构体指针,如下所示。   在上面的图片中,basicRfPktHdr_t是一个结构体,rxM......