mirvar_mem_variable

mirvar_mem_variable定义在miracl.h,实现在mrcore.c

extern flash mirvar_mem_variable(char *,int,int);

函数功能:为字符数组mem的元素对齐设置。

参数mem:字符数组或字符指针。

参数index:下标。

参数sz:个数。

1. 源码分析

mirvar_mem_variable定义相关的函数如下。

struct bigtype
{
    mr_lentype len;
    mr_small *w;
};                
typedef struct bigtype *big;
typedef big flash;

#define MR_INIT_ECN memset(mem,0,mr_ecp_reserve(1,ZZNS)); p=(epoint *)epoint_init_mem_variable(mem,0,ZZNS); 

flash mirvar_mem_variable(char *mem,int index,int sz)
{
    flash x;
    int align;
    char *ptr;
    int offset,r;

/* alignment */
    offset=0;
    // 与long对齐
    r=(unsigned long)mem%MR_SL;
    if (r>0) offset=MR_SL-r; // 偏移量

    // 取第offset+mr_size(sz)*index个元素,并转换为big类型
    x=(big)&mem[offset+mr_size(sz)*index];
    // 指向x的w
    ptr=(char *)&x->w;
    // 对齐位置
    align=(unsigned long)(ptr+sizeof(mr_small *))%sizeof(mr_small);   
    x->w=(mr_small *)(ptr+sizeof(mr_small *)+sizeof(mr_small)-align);   

    return x;
}

char类型指针mem指向一个初始化为0的存储单元,作为epoint_init_mem_variable的参数之一,epoint_init_mem_variable内部调用mirvar_mem_variable

(unsigned long)memchar *强制类型转换,也就是mem的地址强制转换为unsigned long。对(unsigned long)mem%MR_SL,校验r的地址余数是否与long对齐。如果没有对齐,offset纪录偏移量。

mr_size计算需要的字节数,取mem的第offset+mr_size(sz)*index个元素,并强制转换为big类型,放在x

2. 测试地址类型转换

(unsigned long)memchar *强制类型转换,也就是地址常量强制类型转换。

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

#define N 8

int main(){
    char mems[N];
    char *mem = mems;

    memset(mems, 0, sizeof(char) * N);

    int i = 0;
    for(i = 0; i < N; i ++){
        printf("%4X", mems[i]); // 全0
    }
    printf("\n");

    mems[0] = 0X41;

    //对mems的地址强制类型转换
    unsigned long l = (unsigned long)(mem);

    printf("l = %lX\n", l); // mems的地址
    printf("mem = %lX\n", mem); // mems的地址
    printf("mems = %lX\n", mems); // mems的地址

    return 0;
}

测试输出

   0   0   0   0   0   0   0   0
l = 16D4B7930
mem = 16D4B7930
mems = 16D4B7930
© phdlisl all right reserved,powered by GitbookUpdate in 2025-10-11

results matching ""

    No results matching ""