当前位置:网站首页>C语言数组与结构体指针

C语言数组与结构体指针

2022-06-25 00:32:00 呼拉拉啦啦啦啦

C语言数组与结构体指针

在使用修改芯片官方源码的时候,看到官方采用了把结构体指针赋值到数组上的做法,自己做了一番修改,却总是有些问题。示例如下:

#include <stdio.h>
#include <ctype.h>
struct sss1{
    
    int s1;
    int s2;
    int s3;
};
struct sss2 {
    
    int s4;
    int s5;
    int s6;
};

int main(int argc, char *argv[])
{
       int sss[100];

    struct sss1 *sss_1;
    struct sss2 *sss_2;

    sss_1=(struct sss1 *)sss;
    sss_1->s1=1;
    sss_1->s2=2;
    sss_1->s3=3;

    sss_2=(struct sss2 *)(sss+sizeof(struct sss1));
    sss_2->s4=4;
    sss_2->s5=5;
    sss_2->s6=6;

    printf("sss ADD 0X%08X\n",sss);
    printf("sss_1 ADD 0X%08X\n",sss_1);
    printf("sizeof(struct sss1) 0X%08X\n",sizeof(struct sss1));
    printf("sss_2 ADD 0X%08X\n",sss_2);
    for(int i=0;i<20;i++)
    {
    
        printf("sss DATA[%d] 0x%hx\r\n",i,*(sss+i));

    }

    return 0;
}

输出结果如下:

sss ADD 0X06CD9100
sss_1 ADD 0X06CD9100
sizeof(struct sss1) 0X0000000C
sss_2 ADD 0X06CD9130
sss DATA[0] 0x1
sss DATA[1] 0x2
sss DATA[2] 0x3
sss DATA[3] 0x0
sss DATA[4] 0x0
sss DATA[5] 0x0
sss DATA[6] 0x0
sss DATA[7] 0x0
sss DATA[8] 0x0
sss DATA[9] 0x0
sss DATA[10] 0x0
sss DATA[11] 0x0
sss DATA[12] 0x4
sss DATA[13] 0x5
sss DATA[14] 0x6
sss DATA[15] 0x0
sss DATA[16] 0x0
sss DATA[17] 0x0
sss DATA[18] 0x0
sss DATA[19] 0x0

这种操作方式还是很方便的,对于不同数据的叠加
这里有两个问题
1:sss_2的地址为什么不是 0X06CD9100 + 0X0000000C =0X06CD910C
2: sss数组中间3-11是怎么空出来的?

我查了下,有两个知识点
1,sizeof()返回的是该类型的字节数即nchar,结构体sss1包含3个int,64位系统(4char(16 bit))即34个char,所以大小是C=12.
2,指针的加减操作不同于数字的简单加减。指针±数字=指针值+指针类型大小
数字。
这也解释了,为什么sss2的地址偏移了12个int。

修改的方法我这边是在赋值sss_2的时候把sss指针定义成char类型的指针,如下:

#include <stdio.h>
#include <ctype.h>
struct sss1{
    
    int s1;
    int s2;
    int s3;
};
struct sss2 {
    
    int s4;
    int s5;
    int s6;
};

int main(int argc, char *argv[])
{
       int sss[100];

    struct sss1 *sss_1;
    struct sss2 *sss_2;

    sss_1=(struct sss1 *)sss;
    sss_1->s1=1;
    sss_1->s2=2;
    sss_1->s3=3;

    sss_2=(struct sss2 *)((char *)sss+sizeof(struct sss1));
    sss_2->s4=4;
    sss_2->s5=5;
    sss_2->s6=6;

    printf("sss ADD 0X%08X\n",sss);
    printf("sss_1 ADD 0X%08X\n",sss_1);
    printf("sizeof(struct sss1) 0X%08X\n",sizeof(struct sss1));
    printf("sizeof(char) 0X%08X\n",sizeof(char));
    printf("sizeof(int) 0X%08X\n",sizeof(int));
    printf("sss_2 ADD 0X%08X\n",sss_2);
    for(int i=0;i<20;i++)
    {
    
        printf("sss DATA[%d] 0x%hx\r\n",i,*(sss+i));

    }

    return 0;
}

输出结果如下:

sss ADD 0X0AE6FFA0
sss_1 ADD 0X0AE6FFA0
sizeof(struct sss1) 0X0000000C
sizeof(char) 0X00000001
sizeof(int) 0X00000004
sss_2 ADD 0X0AE6FFAC
sss DATA[0] 0x1
sss DATA[1] 0x2
sss DATA[2] 0x3
sss DATA[3] 0x4
sss DATA[4] 0x5
sss DATA[5] 0x6
sss DATA[6] 0x0
sss DATA[7] 0x0
sss DATA[8] 0x0
sss DATA[9] 0x0
sss DATA[10] 0x0
sss DATA[11] 0x0
sss DATA[12] 0x0
sss DATA[13] 0x0
sss DATA[14] 0x0
sss DATA[15] 0x0
sss DATA[16] 0x0
sss DATA[17] 0x0
sss DATA[18] 0x0
sss DATA[19] 0x0

基础不牢,想不明白了好久,记录下吧。

原网站

版权声明
本文为[呼拉拉啦啦啦啦]所创,转载请带上原文链接,感谢
https://blog.csdn.net/m_963852741/article/details/125328964