stdlib.h#

stdlib.h提供一系列帮助函数

Author

Shihong Wang (jack4shihong@gmail.com)

Version

0.1

Date

2023-04-09

Copyright

Copyright Shihong Wang (c) 2023 with GNU Public License V3.0

Warning

为了避免编译时编译器使用系统的stdlib.h库, 编译时需要为GCC指定-nostdinc选项, 详见根目录下的Makefile

Defines

offset(struct_type, member_name)#

offset宏用于获得结构体struct_type中名为member_name成员的偏移量(以字节计算)

举例:

struct person_t {
     uint8_t age;
     uint32_t id;
     char name[10];
};
offset(person_t, age);        # return 0
offset(person_t, id);         # return 1
offset(person_t, name);       # return 5

Parameters:
  • struct_type – 结构体名

  • member_name – 结构体中的成员名

member2struct(struct_type, member_name, elem_ptr)#

member2struct宏用于将指向结构体struct_type中的名为member_name的成员的指针转为指向struct_type的指针

举例:

struct person_t {
     uint8_t age;
     uint32_t id;
     char name[10];
};

person_t jack = {22, 2196113760, "Shihong Wang"};
uint32_t *id_ptr = &jack.id;
# 将指向成员的指针转换为指向结构体的指针
person_t *person_ptr = member2struct(person_t, id, id_ptr);
&jack == person_ptr ? true : false;          # return true

Parameters:
  • struct_type – 结构体名

  • member_name – 结构体中的成员名

  • elem_ptr – 指向结构体中member_name成员的指针

Returns:

struct_type* 指向成员所在的结构体的指针

Functions

void itoa(uint64_t integer, char **buf_ptr_addr, uint8_t base)#

itoa (integer to ascii) 用于将uint64_t数字转换为char*数字, 并将其存入*buf_ptr_addr指向的内存中

Note

因为是使用递归完成的转换, 因此多次递归需要共享字符数组, 因此需要字符数组的二级指针

Parameters:
  • integer – 需要转为字符串形式的整数

  • buf_ptr_addr – 指向接受输出的字符串的指针, 即字符数组名的地址

  • base – 转换进制, 可以任意指定. 例如:

    • base = 2: 将integer转换为二进制形式的字符串数字, 例如 6 = "110"

    • base = 8: 将integer转换为二进制形式的字符串数字, 例如 23 = "27"

    • base = 16: 将integer转换为二进制形式的字符串数字, 例如 47 = "2F"

int64_t atoi(char *str)#

‘atoi函数实现字符串转整形数字

Parameters:

str – 需要转换的字符串

Returns:

int64_t 转换得到的整形数字